字符串重新分配的意外行为
Unexpected behavior of string reallocation
我遇到了字符串函数内存分配的奇怪行为。
注意:现在我被告知忽略分配操作失败。
我的代码是:
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));
从reference开始,我们得到了这个方法的原型:
Return value: A pointer to the reallocated memory block, which may be
either the same as ptr or a new location.
现在,考虑变量(指针)的范围。正如@whozCraig 评论的那样,result =
(在更正后的realloc()
中)为自动变量赋值。调用方传递的原始结果没有变化,现在悬空。这必须用 in/out arg 或函数 return 结果来处理。
那么你可以做的就是简单地return那个指针,通过改变这个:
void string_reallocation(char *result, int result_length) {
到那个:
char* string_reallocation(char *result, int result_length) {
// ...
return result;
}
然后将对此函数的调用更改为:
result = string_reallocation(result, current_length);
我遇到了字符串函数内存分配的奇怪行为。
注意:现在我被告知忽略分配操作失败。
我的代码是:
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));
从reference开始,我们得到了这个方法的原型:
Return value: A pointer to the reallocated memory block, which may be either the same as ptr or a new location.
现在,考虑变量(指针)的范围。正如@whozCraig 评论的那样,result =
(在更正后的realloc()
中)为自动变量赋值。调用方传递的原始结果没有变化,现在悬空。这必须用 in/out arg 或函数 return 结果来处理。
那么你可以做的就是简单地return那个指针,通过改变这个:
void string_reallocation(char *result, int result_length) {
到那个:
char* string_reallocation(char *result, int result_length) {
// ...
return result;
}
然后将对此函数的调用更改为:
result = string_reallocation(result, current_length);