Q
示例處理堆棧變量
0
A
回答
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;
}
相關問題
- 1. 堆棧變量
- 2. JVM堆棧變量
- 3. 導體背堆棧處理
- 4. 堆棧變量在走?
- 5. 有條件堆棧變量
- 6. 返回堆棧變量?
- 7. c堆棧變量損壞
- 8. 調用堆棧上的異常處理堆棧幀的順序
- 9. 簡單堆棧示例,如果堆棧爲空,如何返回?
- 10. IL無堆棧變量的堆棧項的頂部複製
- 11. 在堆棧展開期間打印堆棧變量
- 12. Yegge的原型模式示例如何處理實例變量?
- 13. 如何更改處理器堆棧?
- 14. 包含Linux數據包處理堆棧
- 15. 如何處理內存堆棧過載
- 16. Java異常處理和堆棧跟蹤
- 17. 在堆棧上處理對象破壞
- 18. C++堆棧函數和錯誤處理
- 19. Segmenation Fault - 處理堆棧數據結構
- 20. 工藝處理堆棧溢出
- 21. 腳本Unity後處理堆棧
- 22. 異常處理下溢,而在堆棧
- 23. ImageJ - 圖像在批處理堆棧
- 24. 事件處理程序堆棧
- 25. ArgumentOutOfRangeException是未處理的C#堆棧
- 26. 微軟堆棧中的D3示例
- 27. 鏈式異常堆棧示例
- 28. 堆棧溢出的示例代碼
- 29. React Native 0.44 - 堆棧導航器示例
- 30. 來自Book的C++堆棧示例?
你想用堆棧變量做什麼「相同」? – MikeCAT
「使用指針」!=「通話」免費「」 –
目前尚不清楚您遇到什麼問題。但是你可以將一個指針指向一個棧變量。指針與它們指向的對象的存儲類型正交。 – juanchopanza