возвращаемое значение malloc - PullRequest
2 голосов
/ 27 августа 2010

У меня есть следующие части кода:

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, однако, похоже, что оно работает нормально без приведений. это нужно в этом случае?

спасибо

Ответы [ 4 ]

6 голосов
/ 27 августа 2010

Измените свою функцию на

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

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

5 голосов
/ 27 августа 2010

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

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

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

0 голосов
/ 27 августа 2010

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

0 голосов
/ 27 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...