【发布时间】: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!!!
我的问题有两个:
- 这是这样做的方法吗?
- 为什么第二种方法以分段错误结束?
【问题讨论】:
-
您需要将
realloc()的结果分配回数组变量。如果你在一个函数中做这件事,你要么必须从函数中返回指针,要么将一个指针作为参数传递给一个指针,这样你就可以更新它。 -
为什么不简单地在函数内部分配,然后返回给调用者呢?分配 100 个元素然后在函数内部重新分配所有这些不必要的复杂性的目的是什么?显然,调用者需要数组的大小,但您也可以返回它(在输出参数中)。最简洁的解决方案可能是实现一个除了计算所需大小之外什么都不做的函数。然后,在调用函数中进行分配和初始化(数组填充)。
-
阅读
realloc的文档,而不是使用强制转换来隐藏警告