C语言 字符串重新分配的意外行为



我遇到了使用字符串函数分配内存的奇怪行为。

注意:现在我被告知忽略分配操作的失败。

我的代码是:

void string_reallocation(char *result, int result_length) {
char *temp_result = malloc((strlen(result) + 1) * sizeof(char));
strcpy(temp_result, result);
realloc(result, (result_length + 1) * sizeof(char));
strcpy(result, temp_result);
free(temp_result);
}

此函数在 while 循环中通过迭代调用:

while (current_node != NULL) {
current_value_to_string = current_node->toStringFunc(current_node->value);
current_value_length = (int) strlen(current_value_to_string);
current_length += current_value_length + arrow_length;
string_reallocation(result, current_length);
strcat(result, current_value_to_string);
strcat(result, arrow);
current_node = current_node->next;
}

current_node的类型为 Node,如下所示:

typedef struct t_node {
Element value;
struct t_node *next;
elementDestroy destroyFunc;
elementCopy copyFunc;
elementToString toStringFunc;
} *Node;

问题是,由于某种原因,特别是在第三次迭代中,free(temp_result);因分段错误而失败。

我不认为 while 循环与分段错误有任何关系,但我把它放在这里以防万一。

这是一个双相解决方案,因为您必须了解如何使用realloc(),通过检查其原型。让我们先这样做。

更改此设置:

realloc(result, (result_length + 1) * sizeof(char));

对此:

result = realloc(result, (result_length + 1) * sizeof(char));

因为从参考中,我们得到了这种方法的原型:

返回值:指向重新分配的内存块的指针,可能是 与 PTR 相同或新位置。


现在,考虑变量(指针(的范围。正如@whozCraig所评论的,result =(在更正的realloc()中(为自动变量分配一个值。在调用方传递的原始结果保持不变,现在悬而未决。这必须通过 in/out arg 或函数返回结果来处理。

因此,您可以做的是简单地返回该指针,方法是更改以下内容:

void string_reallocation(char *result, int result_length) {

对此:

char* string_reallocation(char *result, int result_length) {
// ...
return result;
}

然后将对此函数的调用更改为:

result = string_reallocation(result, current_length);

相关内容

  • 没有找到相关文章

最新更新