正在关注 this question ,我正在尝试修改 this blog post 中提供的代码使用动态内存分配创建一个 append
函数。这是我目前所拥有的:
#include <stdio.h>
#include <stdlib.h>
typedef struct intlist_ {
int size;
int* list;
} intlist;
void append(intlist* arr, int value){
realloc((*arr).list, sizeof((*arr).list) + sizeof(int));
(*arr).size = (*arr).size + 1;
(*arr).list[(*arr).size -1] = value;
}
int main() {
intlist arr;
arr.size = 4;
arr.list = malloc(arr.size * sizeof(int));
arr.list[0] = 0;
arr.list[1] = 5;
arr.list[2] = 3;
arr.list[3] = 64;
append(&arr, 12);
for (int ii = 0; ii < arr.size; ii++)
printf("%d, ", arr.list[ii]);
free(arr.list);
return 0;
}
但是我得到的结果是错误的:
clang version 7.0.0-3~ubuntu0.18.04.1 (tags/RELEASE_700/final) main.c:10:3: warning: ignoring return value of function declared with 'warn_unused_result' attribute [-Wunused-result] realloc((*arr).list, sizeof((*arr).list) + sizeof(int)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 warning generated. 0, 5, 3, 64, 0, 5, 3, 64, 12,
我正在使用 this online compiler用于测试,您还可以在其中看到上述代码的最新版本。如果您能帮助我知道我的错误在哪里以及如何解决,我将不胜感激。提前感谢您的支持。
P.S. 您可以在 this Gist 中获得代码的最终版本。 .
最佳答案
关闭,但是:
sizeof((*arr).list)
不会给你数组的大小。相反,它将为您提供int*
的大小。realloc
使原始指针无效,继续使用它是未定义的行为。请改用返回值。
因此,将您的 realloc 行改为使用存储的列表大小,并使用返回值更新指针:
(*arr).list = realloc((*arr).list, ((*arr).size + 1) * sizeof(int));
一些其他提示:
ptr->
与(*ptr).
相同,但更易于阅读。我建议将所有(*arr).size
和(*arr).list
更改为arr->size
和arr->列表
。realloc
与其兄弟一样,不能保证成功。您应该检查null
的返回值以捕获错误。- clang 警告(通常是这种情况)很有帮助 - 检查返回值可以解决几个问题。
关于c - 具有动态内存分配的 C 追加函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55679977/