2015-12-08 59 views
0

我在func1()中有一个静态char数组。而当我调用func2()我传递它的char数组地址(双指针),因为我在它内部分配内存。然后,使用指针进行一些计算,并在第二次函数调用时指针不会被重置,但它指向我分配的字节范围内的某处。双指针指向同一个堆领域的随机地址

比方说,我分配了500字节。第一次通话从0开始,第二次通话继续。

让我们现在另一种方法为例,分配在FUNC1)内存(并且不需要使用相同的代码,只要调用FUNC2双指针()的指针被reseted和从0

开始我为什么经历这个?

CASE 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 


} 

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

} 
+2

请粘贴代码 – mkmk88

+1

请发布一个[最小,完整和可验证的示例](http://stackoverflow.com/help/mcve),它可以证明问题。 –

+0

是的,我应该足够了解这个概念。对不起,能够产生很多 – Maxitj

回答

0

我通过像在情况2中它被认为是coppied阵列和我改变一些 值,对其他致电值存在但指针 始终从头开始?你能解释一下我这个......

在呼吁func2(array)的情况下,不分配的数组对象的副本被传递,但只有一个指针值array的副本,当然,指向同样的内存地址;因此,当func2()更改了数组对象元素的某些值时,这些更改的值自然会出现在具有相同对象地址的另一个调用中,而当func2()通过++array更改array的本地副本时,这不会影响func1()的本地指针名为array

...但对于情况1,只有这样才能表现同样是永远保存 起始位置,所以我可以递减指针?

如果你想在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 
}