我在 func1() 中有一个静态字符数组。当我调用 func2() 时,我将 char 数组(双指针)的地址传递给它,因为我正在其中分配内存。然后,使用指针进行一些计算,在第二次调用函数时,指针不会重置,但它指向我分配的字节范围内的某个位置。
假设我分配了 500 字节。第一个调用从 0 开始,第二个调用继续。
现在让我们以另一种方法为例,在 func1() 中分配内存,并且不需要具有相同代码的双指针,每当调用 func2() 时,指针都会重置并从 0 开始。
为什么我会遇到这种情况?
案例2
func2(char *array){
++array; // position 1
}
func1(){
static char *array;
if(array == NULL){
array = (char*) malloc(500 * sizeof(char));
}
func2(array);
func2(array); // again position 1
}
案例1
func2(char **array){
if(*array == NULL){
*array = (char*) malloc(500 * sizeof(char));
}
++*array; // position 1
}
func1(){
static char *array;
func2(&array);
func2(&array); // calling it again, pointer goes on position 2
// or it starts counting for ex. from position 55(random said)
}
最佳答案
I passed the array like in case 2 it got coppied and I changed some values, on the other call the values were present but the pointer started always from beginning? Could you please explain me this…
在调用func2(array)
的情况下,传递的不是分配的数组对象的副本,而只是指针值array
的副本,当然指向完全相同的内存地址;因此,当 func2() 更改数组对象元素的某些值时,这些更改的值自然会出现在具有相同对象地址的另一个调用中,而当 func2() 更改时通过 ++array
获取 array
的本地副本,这对 func1()
名为 array 的本地指针没有影响
.
… but the only way for the case 1 to behave same is to always save the start position so I can decrement the pointer?
如果您希望在 func2(char **)
中分配数组对象,如情况 1 所示,但 array
指针不会被 func2()
,你可以这样写:
void func2(char **arrayaddress)
{
if (*arrayaddress == NULL) *arrayaddress = malloc(500);
char *array = *arrayaddress; // make own local copy, keep *arrayaddress unchanged
++array; // position 1
}
void func1()
{
static char *array;
func2(&array);
func2(&array); // calling it again, pointer unchanged
}
关于c - 指向同一堆区域的随机地址的双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34153936/