c - 具有动态内存分配的 C 追加函数

标签 c arrays append dynamic-memory-allocation

正在关注 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 中获得代码的最终版本。 .

最佳答案

关闭,但是:

  1. sizeof((*arr).list) 不会给你数组的大小。相反,它将为您提供 int* 的大小。
  2. realloc 使原始指针无效,继续使用它是未定义的行为。请改用返回值。

因此,将您的 realloc 行改为使用存储的列表大小,并使用返回值更新指针:

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

一些其他提示:

  • ptr->(*ptr). 相同,但更易于阅读。我建议将所有 (*arr).size(*arr).list 更改为 arr->sizearr->列表
  • realloc 与其兄弟一样,不能保证成功。您应该检查 null 的返回值以捕获错误。
  • clang 警告(通常是这种情况)很有帮助 - 检查返回值可以解决几个问题。

关于c - 具有动态内存分配的 C 追加函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55679977/

相关文章:

c - 在 C 程序中链接 SDL

c++ - 使用二分搜索从数组中删除字符串

javascript - jQuery 将 div append 到特定的

c - 在c中重新分配二维字符数组

c - 如何将数组传递给函数

c - 如何使用命令参数?

arrays - 对排除 Nil 的数组进行排序

javascript指针数组或#define缩写

swift - 如何在swift中将任何类型的数据 append 到字符串

matrix - Julia - 如何将矩阵添加到矩阵列表中