在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版本7.0.0-3〜ubuntu0.18.04.1(标签/ RELEASE_700 / final) main.c:10:3:警告:忽略使用声明的函数的返回值 'warn_unused_result'属性[-Wunused-result] realloc((* arr).list,sizeof((* arr).list)+ sizeof(int)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ 产生1条警告。 0,5,3,64,0,5,3,64,12,
我正在使用this online compiler进行测试,在这里您还可以看到上述代码的最新版本。如果您能帮助我知道我的错误在哪里以及如何解决,我将不胜感激。感谢您的提前支持。
PS 。您可以在this Gist中找到代码的最终版本。
答案 0 :(得分:2)
关闭,但是:
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->list
。realloc
和它的弟兄一样,不能保证成功。您应该检查null
的返回值以捕获错误。答案 1 :(得分:1)
分配了错误的大小。 sizeof((*arr).list)
是指针的大小,而不是int
。
未使用返回值。 realloc()
返回新的指针。
不进行NULL
检查
不要使用容易出错的ptr = some_alloc(sizeof(type) * n)
,而要使用
ptr = some_alloc(sizeof *ptr * n)
void append(intlist *arr, int value){
int *new_ptr = realloc(arr->list, sizeof *(arr->list) * (arr->size + 1u));
if (new_ptr == NULL) {
fprintf(stderr, "Out of memory\n");
exit (EXIT_FAILURE);
}
arr->list = new_ptr;
arr->list[arr->size] = value;
arr->size++;
}