我遇到了一些指针问题。
这是他们的声明(主要):
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。怎么了?提前谢谢!
答案 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;
}
工作错误 - 并且有多种方式。
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()
发生。在这种情况下,建议重新分配多个元素。
答案 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);