簡體   English   中英

在 C 編程中,如果變量被聲明為全局變量但隨后在 main 中被 malloced 存儲在哪里?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM