c - 指向同一堆区域的随机地址的双指针

标签 c arrays pointers dynamic-memory-allocation double-pointer

我在 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/

相关文章:

c++ - gcc 中的 "Assume"子句

具有指针的结构的 const 正确性

c# - C# ref 的技术含义

c++ - 从一副牌发牌(不重复的牌)

c++ - 在环形网格内创建一个 3x3 框

c - 奇怪的指针函数

c - 特定于体系结构的 header

c - Linux系统V IPC : Unable to initialize semaphore value

arrays - Matlab中清空结构体数组的所有字段

Javascript 数组在回调循环中发生变化