【问题标题】:C - pass array to function and realloc inside the functionC - 将数组传递给函数并在函数内部重新分配
【发布时间】:2014-12-11 08:00:58
【问题描述】:

我需要创建一个由函数填充的动态数组。我有 无法提前知道该阵列有多大。所以我做了以下事情:

TAB_TYPE *column_types = malloc(100*sizeof(TAB_TYPE));
hExtract = make_table_definition(jsstr, tokens, column_types);

我随机决定分配 100 个元素。在函数内部,我调整了它的大小:

realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE)))

使用 GCC 编译时,上述行产生以下错误:

error: ignoring return value of ‘realloc’, declared with attribute warn_unused_result  

我设法通过这样的方式:

if (!(int *) realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE)))
    log_die("Failed to allocate memory to column_types!");

log_die 存在,并带有发送到 stderr 的消息。

我还尝试了以下方法,这会产生分段错误:

 //first declare a NULL pointer:
 TAB_TYPE *column_types = NULL; 

 //inside the function
TAB_TYPE *t = realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE));
if (!t){
    log_die("Failed to allocate memory to column_types!");
}else{
    column_types = t ;
}

// outside the function
for (int i=0; i < tokens[0].size / 2; i++ )
    printf("Type %d : %d\n", i, column_types[i]); -> SEGMENTATION FAULT!!!

我的问题有两个:

  1. 这是这样做的方法吗?
  2. 为什么第二种方法以分段错误结束?

【问题讨论】:

  • 您需要将realloc() 的结果分配回数组变量。如果你在一个函数中做这件事,你要么必须从函数中返回指针,要么将一个指针作为参数传递给一个指针,这样你就可以更新它。
  • 为什么不简单地在函数内部分配,然后返回给调用者呢?分配 100 个元素然后在函数内部重新分配所有这些不必要的复杂性的目的是什么?显然,调用者需要数组的大小,但您也可以返回它(在输出参数中)。最简洁的解决方案可能是实现一个除了计算所需大小之外什么都不做的函数。然后,在调用函数中进行分配和初始化(数组填充)。
  • 阅读realloc 的文档,而不是使用强制转换来隐藏警告

标签: c arrays realloc


【解决方案1】:

当你重新分配时,你又在创建内存。您需要将该内存重新分配给您的指针。但是,当您将指针传递给函数时,您可以更改该指针指向的值,但不能更改指针本身。为此,您有 2 个选项

  1. 返回重新分配的指针并将其分配给初始指针
  2. 将指针作为指向指针的指针传递。

这更好地解释了它

How do I modify a pointer that has been passed into a function in C?

【讨论】:

    【解决方案2】:

    第 1 点:

    C 使用pass-by-value 进行函数参数传递。要从其他函数更改column_types 的内存分配,您需要将指针传递给column types

    澄清一下,如果在分配内存后将 column_types 传递给其他函数,您将能够更改该内存位置 [*column_types] 指向的 ,而不是指针 [column_types] 本身。

    第 2 点:

    TAB_TYPE *t = realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE));
    

    realloc() 将调整column_types 的现有内存大小,并将返回一个指向新分配内存的指针,该指针收集在t 中,并将free() 现有分配。您应该从函数中返回 t 并将返回值分配给 TAB_TYPE 指针。

    来自realloc()man page

    void *realloc(void *ptr, size_t size);
    

    realloc() 函数返回一个指向新分配的指针 内存,它适合任何类型的变量对齐,并且可以是 不同于ptr,

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 2018-04-28
      • 1970-01-01
      • 2021-12-08
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      相关资源
      最近更新 更多