簡體   English   中英

使用動態內存分配為C附加函數

[英]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中找到代碼的最終版本。

關閉,但是:

  1. sizeof((*arr).list)不會給你數組的大小。 相反,它會給你一個int*的大小。
  2. realloc使原始指針無效,並繼續使用它是未定義的行為。 請改用返回的值。

因此,更改您的realloc行以使用存儲的列表大小,並使用返回值更新指針:

(*arr).list = realloc((*arr).list, ((*arr).size + 1) * sizeof(int));

其他一些提示:

  • ptr->(*ptr).相同(*ptr). 但更容易閱讀。 我建議將所有(*arr).size(*arr).list更改為arr->sizearr->list
  • 像其弟兄一樣, realloc並不能保證成功。 您應該檢查null的返回值以捕獲錯誤。
  • clang警告(通常是這種情況)很有幫助 - 檢查返回值將解決幾個問題。
  • 分配錯誤的大小。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM