【问题标题】:return value of mallocmalloc 的返回值
【发布时间】:2010-08-27 15:43:22
【问题描述】:

我有以下代码部分:

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 时需要强制转换,但是,如果没有强制转换,这似乎可以正常工作。这种情况下需要吗?

谢谢

【问题讨论】:

  • 在 C 中,从 malloc 中强制转换返回不仅是不必要的,而且是不可取的,因为它可以掩盖忘记到 #include <stdlib.h> 的错误。
  • 返回 char* 的目标是什么?这不是 C 错误,但我不明白为什么初始化对象的函数应该返回任何数据。

标签: c


【解决方案1】:

把你的函数改成

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

malloc 的返回值是一个 void*,在 C 中(与 C++ 不同),一个 void* 可以隐式转换为任何 其他指针类型 - 函数指针除外。所以你不需要演员表。

【讨论】:

    【解决方案2】:

    你的函数原型需要是:

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

    C 中的malloc() 不需要强制转换;但是,它是用 C++ 编写的。

    【讨论】:

      【解决方案3】:

      在 C 中,在 ANSI C 之前需要对 malloc 进行强制转换,因为没有 void* 类型(可能作为某些 C 编译器的扩展),但在 ANSI C 之后根本不需要强制转换,如果你这样做了您正在通过编译器抑制一些有用的诊断,这对您的程序更有害。永远不要在 C 中对 malloc() 进行强制转换。

      【讨论】:

        【解决方案4】:

        虽然在这种情况下,这里的演员表适合你。建议您在尝试将它们分配给不同的类型之前,养成投射事物的习惯。以后省了很多苦。此外,当将此代码合并到 C++ 中时,它可以节省大量时间。

        【讨论】:

          猜你喜欢
          • 2017-03-23
          • 2020-09-03
          • 2015-06-17
          • 2011-07-18
          • 1970-01-01
          • 2017-04-16
          • 1970-01-01
          • 2017-07-30
          • 2015-07-20
          相关资源
          最近更新 更多