[英]Freeing a pointer makes my program crash
我在使用指针时遇到了麻烦。
这是他们的声明(主要):
int *dot_positions = (int *)malloc(sizeof(int));
char *str = (char *)malloc((MAX_N + 1) * sizeof(char));
其中MAX_N是100,并且是字符串的限制。 dot_positions [0] = -1;
我将一个值添加到'dot_position'的第一个位置,然后在运行时调用以下函数以添加其他值。
int add_dot_to_array(int *array, int position, int array_len) {
array = (int *)realloc(array, array_len + 1);
array[array_len] = position;
return array_len + 1;
}
在main()的末尾,我释放了指针:
free(str);
free(dot_positions);
但这会导致我的程序崩溃。 我在Windows x64机器上将Orwell Dev-C ++与Mingw一起使用。 我也确保这些指针不是NULL。 怎么了? 提前致谢!
由于您没有在调用者的环境中重新设置指针,因此您失去了地址realloc()
返回。 这会导致该指针(来自原始malloc()
)变为陈旧状态,并释放它而导致崩溃。
要解决此问题,请使其为add_dot_to_array(int **array, int position, int array_len)
以便可以更改调用者的指针。 还要确保不要在每次添加时都重新分配 realloc()
,因为那样会降低性能。
另外, 不要在C中malloc()
的返回值 ,也不要通过sizeof (char)
“缩放”字符串分配。
在add_dot_to_array中,您按值传递了一个指针-因此该函数具有自己的本地指针(该指针与调用指针指向同一数组)。 调用realloc之后,将更新本地指针,但不会更新调用站点上的原始指针。
尝试将指针传递给指针(例如**,这样原始指针也将得到更新)。
int add_dot_to_array(int **array, int position, int array_len) {
然后像这样打电话:
add_dot_to_array(&dot_positions, ...
正如放松所说,
int add_dot_to_array(int *array, int position, int array_len) {
array = (int *)realloc(array, array_len + 1);
array[array_len] = position;
return array_len + 1;
}
运作错误-并以多种方式这样做。
array
返回给调用方。 realloc()
是否成功。 更好:
int add_dot_to_array(int ** parray, int position, int * array_len) {
int * new_array = realloc(*parray, (array_len + 1) * sizeof(*new_array)); // correct size!
if (!new_array) return -1;
*parray = new_array;
new_array[(*array_len)++] = position;
return 0;
}
被称为
int result = add_dot_to_array(&my_pointer, pos, &my_saved_length);
并进行正确的结果检查。
请注意,为添加的每个单个元素调整缓冲区大小并非最佳选择。
更好的方法:保持alloced_size
和used_size
。 used_size
在每次加法时都会增加,并且只有在达到alloced_size
发生realloc()
。 在这种情况下,建议重新分配多个以上的其他元素。
为了保留新地址,请执行此操作
int add_dot_to_array(int ** array, int position, int array_len)
{
*array = (int *)realloc(*array, array_len + 1);
*array[array_len] = position;
return array_len + 1;
}
//For calling the function
add_dot_to_array(&dot_positions,1,1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.