2013-10-11 23 views
6

Tamam, bu yüzden C değeri-değer, yani değişkenin bir kopyası, parametre için orijinal değişken yerine kullanılır, sağ? Yani, bu kopya her zaman aynı hafıza adresine sahip olacak mı?C'de bir işlev parametresi her zaman aynı bellek adresine sahip mi?

void test(int *ptr) { 
    printf("&ptr: %p\n", &ptr); 
    printf("ptr: %p\n", ptr); 
    printf("*ptr: %d\n\n", *ptr); 
} 

int main() { 
    int a = 1, b = 2, c = 3, d = 4, e = 5; 
    test(&a); 
    test(&b); 
    test(&c); 
    test(&d); 
    test(&e); 

    return 0; 
} 

bu koddan almak çıkışı şudur: Bu kodu düşünün

&ptr: 0x7fff70536728 
ptr: 0x7fff7053674c 
*ptr: 1 

&ptr: 0x7fff70536728 
ptr: 0x7fff70536750 
*ptr: 2 

&ptr: 0x7fff70536728 
ptr: 0x7fff70536754 
*ptr: 3 

&ptr: 0x7fff70536728 
ptr: 0x7fff70536758 
*ptr: 4 

&ptr: 0x7fff70536728 
ptr: 0x7fff7053675c 
*ptr: 5 

İçimdeki his "hayır" oldu. ptr'un test() kod bloğu dışında bulunmadığı benim anlayışım. Peki, neden tüm 5 işlev çağrıları için &ptr aynıdır? ptrtest() içinde yerel bir değişken olduğundan

+4

Aynı olması garanti edilemez. Belirtilmemiş davranışları gözlemliyorsunuz. (Ana ek olarak başka bir işlevden çağırırsanız adres değişikliğini görebilirsiniz.) –

+0

ve arayarak bir işlev çağrısı olmadan bile bu davranışı göstermeyebilir. belirli bir makinede uygulamaya bağlı olarak. –

+0

@AndyzSmith ayrıca derleyicinin bunu nasıl uygulamaya koyduğuna bağlı olarak değişir. :) – jmstoker

cevap

6

&ptr aynıdır. Araya hiçbir şey yapmadan art arda beş kez test() aradığınızdan beri, her seferinde yığında aynı adres verilir (not, bu herhangi bir şekilde gerekli değil C tarafından - sadece makinenizin nasıl olduğu Bunu yapıyor ve genellikle nasıl olur? Sonra kendisi test() adlı ikinci işlevi çağrılırsa

, sen ptr önceden şimdi müdahale işlev çağrısı tarafından kullanılıyor ikamet edildiği yığının üzerine o alanda beri &ptr için aynı çıktıyı almak değildir. Örneğin

:

#include <stdio.h> 

void test(int *ptr) { 
    printf("&ptr: %p\n", (void *) &ptr); 
    printf("ptr: %p\n", (void *) ptr); 
    printf("*ptr: %d\n\n", *ptr); 
} 

void test_test(void) { 
    int a = 1; 
    test(&a); 
} 

int main() { 
    int a = 1, b = 2, c = 3, d = 4, e = 5; 

    test(&a); 
    test(&b); 
    test(&c); 
    test(&d); 
    test(&e); 
    test_test(); 

    return 0; 
} 

verimleri:

[email protected]:~/src/c/scratch$ ./ptrtest 
&ptr: 0x7fff39f79068 
ptr: 0x7fff39f7909c 
*ptr: 1 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f79098 
*ptr: 2 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f79094 
*ptr: 3 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f79090 
*ptr: 4 

&ptr: 0x7fff39f79068 
ptr: 0x7fff39f7908c 
*ptr: 5 

&ptr: 0x7fff39f79048 
ptr: 0x7fff39f7906c 
*ptr: 1 

[email protected]:~/src/c/scratch$ 

ve &ptrtest_test() aracılığıyla yapılır son aramanın, farklı olduğunu görebilirsiniz.

+0

Ah tamam, şimdi mantıklı. – instagatorTheCheese

İlgili konular