C - 将数组传递给函数内部的函数和realloc

时间:2014-12-11 08:00:59

标签: c arrays realloc

我需要创建一个动态数组,而不是由函数填充。我有 没办法事先知道那个阵列有多大。所以我做了以下事情:

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. 为什么第二种方法以分段错误结束?

2 个答案:

答案 0 :(得分:2)

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

  1. 返回重新分配的指针并将其指定给初始指针
  2. 将指针作为指针传递给指针。
  3. 这更好地解释了

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

答案 1 :(得分:0)

第1点:

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

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

第2点:

column_types

TAB_TYPE *t = realloc(column_types, tokens[0].size /2 * sizeof(TAB_TYPE)); 将调整realloc()的现有内存大小,并返回指向新分配的内存的指针,该内存在column_types中收集,它将t现有的分配。您应该从函数返回free()并将返回值分配给t指针。

来自TAB_TYPE

man page
realloc()

  

realloc()函数返回指向新分配的指针   记忆,适合任何类型的变量,可能是   与ptr不同,