2015-10-18 55 views
0

我一直在經歷這一章Pointers和碰到這樣的句子:示例處理堆棧變量

您將使用指針來處理已經在堆上分配 變量。 (你可以使用指針來處理棧變量,但在大多數情況下,這是不必要的)。

我知道如何使用指針來處理已經分配到堆上的變量。但我無法想象如何使用它來處理堆棧變量。由於堆棧變量會在函數退出時自動釋放(即變量被推出堆棧),但如何使用類似free系統調用的指針(如上面引用的文本所暗示的)執行相同的操作?那可能嗎 ?

+0

你想用堆棧變量做什麼「相同」? – MikeCAT

+1

「使用指針」!=「通話」免費「」 –

+0

目前尚不清楚您遇到什麼問題。但是你可以將一個指針指向一個棧變量。指針與它們指向的對象的存儲類型正交。 – juanchopanza

回答

1

您可以通過使用地址運算符&來獲取本地變量的地址(分配在堆棧上)。然後這個地址可以存儲在一個指針中,並且可以用來指向堆上的一個變量。但是,您應該而不是free()存儲的地址,因爲這構成未定義的行爲。

1

簡單的例子:

int i; 
scanf("%d", &i); 

的指針堆棧變量i被傳遞到scanf()以存儲結果那裏。

1

與堆棧變量一起使用指針的常見示例:修改來自另一個函數的局部變量的值。

#include <stdio.h> 

void hoge(int *a) { 
    *a = *a + 10; 
} 

int main(void) { 
    int foo = 5; 
    printf("%d\n", foo); 
    hoge(&foo); 
    printf("%d\n", foo); 
    return 0; 
} 
0

函數內部可以使用指針算術並在堆棧上引用變量。 變量在函數的開頭被壓入堆棧,並在結束時彈出。

在這個例子中,你可以通過一個地址訪問b(記住堆棧What is argument push order上推送的參數順序)。

void fnc(unsigned int a, unsigned int b) { 
    unsigned int *pb = (unsigned int *)((long)&a - (long)sizeof(int)); 
    printf("%d\n", *pb); 
} 
0

另一個例子是一種非常流行且已知的交換兩個變量值的方法。

#include <stdio.h> 

void Swap(char *x,char *y); 

int main(void) 
{ 
    char character1 = 'a'; 

    char character2 = 'z'; 

    Swap(&character1,&character2); 

    printf("character1 now is : %c\n",character1); 

    printf("character2 now is : %c\n",character2); 
} 

void Swap(char *x,char *y) 
{ 
    char tmp; 

    tmp = *x; 

    *x = *y; 

    *y = tmp; 
}