我需要创建一个动态数组,而不是由函数填充。我有 没办法事先知道那个阵列有多大。所以我做了以下事情:
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!!!
我的问题是两个:
答案 0 :(得分:2)
当你重新分配时,你又在创造记忆。您需要将该内存重新分配给指针。但是当您将指针传递给函数时,您可以更改该指针指向的值,而不是指针本身。为此,您有2个选项
这更好地解释了
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
realloc()
和
realloc()函数返回指向新分配的指针 记忆,适合任何类型的变量,可能是 与ptr不同,