2015-04-14 140 views
1

我们有一个代码。C静态数组指针地址

#include <stdio.h> 

int* aa(int s){ 
    static int ad[2] = {0}; 
    ad[0] = s; 
    printf("aa() -> %p\n", &ad); 
    return ad; 
} 

int main(void) { 
    int *k = aa(3); 
    printf("main() -> %p\n", &k); 
    return 0; 
} 

编译,运行.. 输出

aa() -> 0x80497d0 
main() -> 0xbfbe3e0c 

或我误解或该代码有问题。

我们返回的是静态数组的相同地址ad为什么输出它们不同?

回答

4

main你打印的k指针变量的地址,该数组的不是地址,它指向。如果你这样做:

printf("main() => %p\n", k); 

你会得到相同的地址打印在aa

+0

确定,但技术上在中低端的 地址'k'不是'ad'的地址? 所以他们可能是相同的,或不是? – Daniel

+0

是的。当您将数组作为值返回时,它会自动转换为第一个元素的地址,就像将它作为参数传递给'printf'一样。 – Barmar

2

你写了printf“& k”这应该只是“k”。因此你显示了变量k的地址,而不是广告。 :

#include <stdio.h> 

int* aa(int s){ 
    static int ad[2] = {0}; 
    ad[0] = s; 
    printf("aa() -> %p\n", &ad); 
    return ad; 
} 

int main(void) { 
    int *k = aa(3); 
    printf("main() -> %p\n", k); 
    return 0; 
} 
1

&k返回地址k而不是它指向的地址。所以,你得到的是k的地址。你应该改变你的printf()

printf("main() -> %p\n", k); 
         ^
         No need for &