繁体   English   中英

释放指针会使我的程序崩溃

[英]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;
}

运作错误-并以多种方式这样做。

  1. 您不会将新array返回给调用方。
  2. 您无需检查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_sizeused_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM