-1

我有这行:

char* data = (char *) mmap(NULL, size, PROT_READ, MAP_SHARED, fd, offset);
...
size_t lineLength = strlen(data);
char *out = calloc(lineLength, sizeof(data));

在最后一行,我使用新的 XCode 得到以下警告

Result of 'calloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'char *'

我有点卡住了这是一个真正的抱怨吗?

4

2 回答 2

4

是的,这是真的。它甚至还没有发现整个问题。

当使用malloc()函数家族动态分配内存时,函数家族calloc()是一个元素的成员,代码通常如下所示:

T *ptr = malloc(sizeof(T));

只要您不更改指针的类型就可以了。当您这样做时,您忘记更改 中的类型sizeof(),并且可能最终分配的内存少于您的T类型占用的内存,从而有效地使您的程序调用未定义的行为。

而你只是遇到了这个问题。(虽然,从技术上讲,在这里你分配的内存比需要的多,没有 UB,但从概念上讲它仍然是错误的。)

char *out = calloc(lineLength, sizeof(data));

真的应该

char *out = calloc(lineLength + 1, sizeof(*data));

反而。您想为 的lineLength + 1片段分配空间char,而data是指向字符的指针。

哦,不要将返回值转换为mmap()!

于 2013-06-14T07:13:53.573 回答
2

您需要更正 calloc() 语句:

任何一个:

char *out = calloc(lineLength, sizeof(*data));

我认为您需要这个,因为我可以理解您正在分配字符串

或者

char **out = calloc(lineLength, sizeof(data));

取决于你的需要。

额外的一点是为 NULL\0符号分配额外的内存来终止字符串。例如对于第一个案例:

 char *out = calloc(lineLength + 1, sizeof(*data)); 
于 2013-06-14T07:09:59.353 回答