带有动态内存分配的C附加功能

时间:2019-04-14 20:58:47

标签: 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版本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中找到代码的最终版本。

2 个答案:

答案 0 :(得分:2)

关闭,但是:

  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->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++;
}