2

我在使用指针时遇到了一些麻烦。

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

int *dot_positions = (int *)malloc(sizeof(int));
char *str = (char *)malloc((MAX_N + 1) * sizeof(char));

其中 MAX_N 为 100,是字符串的限制。点位置[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

4 回答 4

6

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

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

此外,不要强制转换malloc()in C的返回值,也不要通过sizeof (char).

于 2013-10-25T11:35:26.523 回答
1

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

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

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

并调用:

add_dot_to_array(&dot_positions, ...
于 2013-10-25T11:41:53.267 回答
0

正如 unwind 所说,

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_size和一个used_sizeused_size每次添加都会增加 ,并且只有当它达到 时,才会alloced_size发生realloc()。在这种情况下,建议重新分配不止一个附加元素。

于 2013-10-25T11:42:34.377 回答
-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);
于 2013-10-25T11:43:09.863 回答