2010-08-27 4 views
2

У меня есть следующие части коды:возвращаемого значения таНоса

typedef struct Board* BoardP; 

typedef struct Board { 
    int _rows; 
    int _cols; 
    char *_board; 

} Board; 

char* static allocateBoard(BoardP boardP, int row, int col) { 

    boardP->_rows = row; 
    boardP->_cols = col; 
    boardP->_board = malloc(row * col * sizeof(char)); 

    return boardP->_board; 
} 

я не могу показаться, чтобы выяснить, почему это дает ошибку ожидается идентификатор или «(» перед «статического» он дает ошибку после того, как я изменил тип возвращаемого значения на char *, когда он был недействителен, не была дана ошибка.

и еще один вопрос: мне было приказано, что при использовании malloc приведение должно выполняться нормально, без приведения необходимо ли в этом случае?

благодаря

+0

В C отбрасывание возврата из malloc не только необязательно, но и нежелательно, так как оно может скрыть ошибку, забывшуюся «#include ». –

+1

Какова цель возврата char *? Это не ошибка C, но я не понимаю, почему функция, инициализирующая объект, должна возвращать любые данные. – tibur

ответ

5

Ваш прототип функции должен быть:

static char* allocateBoard(BoardP boardP, int row, int col) 

Нет броска не требуется на malloc() в C; однако он находится в C++.

6

Изменить вашу функцию к

static char* allocateBoard(BoardP boardP, int row, int col): 

возвращаемого значения таНоса пустота *, и в C (в отличии от C++), пустота * является implicittly конвертируется в любой другого типа указателя - кроме функции указатели. поэтому вам не нужен бросок.

0

В C Для кастомизации требуется MOLOOC до ANSI C, поскольку не существует типа void * (возможно, как расширение для некоторых компиляторов C), но после ANSI C нет необходимости в кастинге вообще, если вы это делаете то вы подавляете некоторую полезную диагностику компилятором, который более вреден для вашей программы. Никогда не делайте литье на malloc() в C.

0

Хотя кастинг здесь в этом случае работает на вас. Предполагается, что вы привыкли бросать вещи, прежде чем пытаться присвоить их другому типу. Это сэкономит много боли позже. Также при включении этого кода в C++ это экономит много времени.