我是 C 新手,目前正在學習堆和堆疊。在我們的課堂上,我們有一個像這樣的有問題的函式
int* Problematic(int capacity) {
int data[capacity];
// do something
return data;
}
我知道這只會回傳一個懸空指標(是嗎?),因為堆疊將在函式完成執行時釋放函式中的所有內容。我的問題來了:
- 這個問題會發生在所有回傳型別是指標但它們在堆疊上運行的函式上嗎?(因為它們只是回傳一個地址,并且在函式完成運行時堆疊洗掉所有東西)?
- 除了將堆疊連接到堆(例如指向堆上的地址)之外,指標還可以做任何其他事情嗎?
- 根據我的理解,堆疊和堆的區別在于,對于堆疊來說,堆疊不是由程式員手動分配記憶體,而是堆疊由系統連續自動分配記憶體。所以我想知道我是否有一個像這樣的
int ReturnInt() {const int a = 5;return a;}函式,這個函式實際上回傳的是什么,如果它回傳一個地址,不會像以前一樣堆疊洗掉 5 嗎?如果這個函式回傳一個整數 5,如何解釋這個整數在記憶體中,因為它只是在 RAM 中添加了 4 個位元組并且記憶體地址仍然發生變化?
非常感謝您的幫助:)
uj5u.com熱心網友回復:
是的。回傳本地非靜態地址沒有什么價值。此類回傳的地址無法用于取消參考。您仍然可以
printf("%p\n",(void*)the_address)使用它們,但這就是您可以對它們做的所有事情。(static不過,回傳本地地址是有意義的。這樣回傳的本地地址可以安全地取消參考。)指標可以指向任何東西:全域變數、靜態變數,并且它們可以從呼叫者傳遞(例如,呼叫者可以在堆疊上分配目標)。
int ReturnInt(){const int a = 5;return a;}在大多數平臺上通過暫存器回傳。如果這不可能,編譯器將確保呼叫者為回傳值分配了堆疊空間。
uj5u.com熱心網友回復:
這個問題會發生在所有回傳型別是指標但它們在堆疊上運行的函式上嗎?(因為它們只是回傳一個地址,并且在函式完成運行時堆疊洗掉所有東西)?
是的,如果他們回傳一個指向函式堆疊上分配的東西的指標。
除了將堆疊連接到堆(指向堆上的地址)之外,指標還有其他功能嗎?
當然。例如,從堆分配的一個物件可能包含指向在堆上分配的另一個物件的指標。
根據我的理解,堆疊和堆的區別在于,對于堆疊來說,堆疊不是由程式員手動分配記憶體,而是堆疊由系統連續自動分配記憶體。所以我想知道我是否有這樣的函式 int ReturnInt() {const int a = 5;return a;} 這個函式實際上回傳什么,如果它回傳一個地址,不會像以前一樣堆疊洗掉 5 嗎?如果這個函式回傳一個整數 5,如何解釋這個整數在記憶體中,因為它只是在 RAM 中添加了 4 個位元組并且記憶體地址仍然發生變化?
它不回傳地址。它的回傳型別是int,它回傳整數值 5,而不是任何地址。該函式回傳值5。實作不需要將該 5 存盤在記憶體中,它可能會也可能不會按照自己的意愿這樣做。例如,它可以在暫存器中回傳值 5。
uj5u.com熱心網友回復:
#2 問題(不清楚,但這里有一個鏡頭)
您還有第三個存盤空間選項 - 靜態。那是您在編譯時要求的固定大小
#include<stdio.h>
char buffer[500];
...
int main(int argc, char**argv){
}
buffer是靜態分配的 500 個位元組
uj5u.com熱心網友回復:
絕對地。如果函式回傳指向分配在其堆疊上的資料的指標,則堆疊在退出函式后變為無效,并且指標將指向無效位置。
問題不清楚。
堆疊是記憶體中分配給函式內部使用的空間。它被保留用于函式呼叫,并在函式回傳后被釋放以供任何其他用途。在您的示例
int ReturnInt() {const int a = 5;return a;}中,沒有指標。結果按值回傳。換句話說,變數的a值在回傳之前被復制到函式回傳值的位置。這會保留該值并允許在函式回傳后使用它。以下帶指標將不起作用:int *ReturnIntPtr(){int a = 5; return &a;}. 在這里,您回傳一個指向堆疊的指標,該指標在回傳后無效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/439012.html
下一篇:C中指向char的指標陣列
