[英]In C programming, where is a variable stored if it is declared as a global variable but is then malloced in main?
我知道全局變量存儲在靜態數據中,使用 malloc 的東西存儲在堆上。 這個案子似乎自相矛盾。 它會被存放在哪里?
前任:
char* example;
int main(){
example = malloc(1);
}
編輯:謝謝大家,我想我現在明白了!
沒有矛盾。
在文件范圍內定義的變量通常位於程序的數據區中,而動態分配的內存位於堆中。 在您的示例中,變量example
位於數據段中,而它指向的內存(在調用malloc
)位於堆中。
當你在C程序中聲明一個全局變量時,它在執行時確實是存放在進程的數據段中的。 現在給出你的例子,你會有這樣的事情:
#include <stdio.h>
#include <stdlib.h>
int *num; // or int *num = NULL;
int main(int argc, char *argv[]){
num = malloc(sizeof(int));
*num = 10;
return 0;
}
在此示例中,數據段中存在的是編譯器為名為 num 的 int * 保留的空間。 當執行 malloc 時,堆中的內存確實為 int 保留,並且該內存的地址被返回並存儲在 num 中。
因此 num 確實存在於數據段中,但實際數據(在這種情況下為 10)存儲在 num 指向的地址中,該地址位於堆中。 我盡我所能盡可能清楚地解釋它,但請隨時要求任何澄清。
干得好:
#include <stdio.h>
#include <stdlib.h>
struct really_big_data {
char data[2000];
size_t used;
};
struct really_big_data
global_data; /* all space allocated in program static at program startup */
struct really_big_data
*global_ptr; /* space for one pointer in program static */
int main() {
global_ptr = calloc(1, sizeof *global_ptr); /* space on heap allocated at runtime */
free(global_ptr);
return 0;
}
的空間(很可能的8個字節或4個字節)為address
,通常是在可執行文件中的數據段。 你用malloc
分配的字節將在進程的堆上。
沒有矛盾,因為“全局”更多是詞匯考慮,不一定是您的問題提出的空間考慮。 具有全局作用域(即文件作用域)的變量意味着任何代碼塊都可以引用它。 例外情況是,如果您有一個同名的局部作用域變量,在這種情況下,該塊將無法尋址全局作用域變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.