释放指针会导致程序崩溃

时间:2013-10-25 11:33:10

标签: c pointers

我遇到了一些指针问题。

这是他们的声明(主要):

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。怎么了?提前谢谢!

4 个答案:

答案 0 :(得分:6)

您正在丢失地址realloc()返回,因为您没有在调用者的环境中重新设置指针。这会导致指针(来自原始malloc())过时,并使其崩溃。

要解决此问题,请将其设为add_dot_to_array(int **array, int position, int array_len),以便更改调用者的指针。另外,请确保每次添加 realloc(),因为这会影响性能。

另外,don't cast the return value of malloc() in C,并且不要按sizeof (char)“缩放”字符串分配。

答案 1 :(得分:1)

在add_dot_to_array中,您按值传递指针 - 因此该函数具有自己的本地指针(指向与调用指针相同的数组)。调用realloc后,本地指针会更新,但不会更新调用站点的原始指针。

尝试将指针传递给指针(例如**,以便原始指针也得到更新)。

int add_dot_to_array(int **array, int position, int array_len) {

并打电话:

add_dot_to_array(&dot_positions, ...

答案 2 :(得分:0)

正如放松所说,

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()是否成功。
  3. 更好:

    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_sizeused_size会在每次添加时递增,只有当它到达alloced_size时才会realloc()发生。在这种情况下,建议重新分配多个元素。

答案 3 :(得分:-1)

要保留新地址,请执行此操作

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);