簡體   English   中英

null 初始化全局指針變量的 C 程序的 memory 布局是什么?

[英]What is memory layout of C program for null initialized global pointer variable?

我編寫了一個簡短的程序來檢查ptr1ptr2的 memory 分配區域。 我發現ptr1ptr2存在於.bss (未初始化的數據段)中,因為我已經使用NULL進行了初始化,我的問題是它們怎么會出現在 go in.bss 部分?

據我了解,它們應該是 .data 段的一部分。

#include <stdio.h>

char *ptr1 = NULL;
int *ptr2 = NULL;

int main()
{
    return 0;
}

廣泛使用的“bss”和“data”段包含兩個初始化變量。 不同之處在於“數據”段將加載來自應用程序圖像*1的值。 段“bss”將用零初始化。

由於不需要在應用程序的圖像中存儲大量的零,因此普通系統不會這樣做。 所以只有“數據”段的初始值包含在圖像中。 您可能會將其視為一種原始的上下文感知壓縮。

如果您在沒有顯式初始化的情況下定義 static 變量,則 C 標准承諾將其歸零,這是一種隱式初始化。 因此,使用零值*2的顯式初始化是等價的。 但是,它使您的源代碼在適用的情況下更易於理解。

注意:另一個常見的段是“rodata”,它包含所有只讀的 static 變量。

* 1:這樣的圖像可以是您文件系統中的可執行文件,或者對於簡單的嵌入式系統,flash 中的某些部分。

* 2: NULL是具有這種值的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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