[英]Append function for C with dynamic memory allocation
在這個問題之后 ,我正在嘗試修改此博客文章中提供的代碼,以使用動態內存分配創建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:警告:忽略用'warn_unused_result'屬性聲明的函數的返回值[-Wunused-result] realloc(( * arr)。list,sizeof((* arr).list)+ sizeof(int)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~生成了~~~ 1個警告。 0,5,3,64,0,5,3,64,12,
我正在使用這個在線編譯器進行測試,您還可以在其中查看上述代碼的最新版本。 如果你能幫助我知道我的錯誤在哪里以及如何解決它,我將不勝感激。 感謝您的支持。
PS你可以在這個Gist中找到代碼的最終版本。
關閉,但是:
sizeof((*arr).list)
不會給你數組的大小。 相反,它會給你一個int*
的大小。 realloc
使原始指針無效,並繼續使用它是未定義的行為。 請改用返回的值。 因此,更改您的realloc行以使用存儲的列表大小,並使用返回值更新指針:
(*arr).list = realloc((*arr).list, ((*arr).size + 1) * sizeof(int));
其他一些提示:
ptr->
與(*ptr).
相同(*ptr).
但更容易閱讀。 我建議將所有(*arr).size
和(*arr).list
更改為arr->size
和arr->list
。 realloc
並不能保證成功。 您應該檢查null
的返回值以捕獲錯誤。 分配錯誤的大小。 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++;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.