簡體   English   中英

C程序和段

[英]c-program and segments

#include<stdio.h>
int main()
{
   char *p="mystring";
   return 0;
}

字符串文字“ mystring”,將存儲在哪里(在哪個段中)? 我假設“ mystring”的地址存儲在“ p”中,“ p”將存儲在數據段中,“ mystring”將存儲在代碼段中。 如果我的假設是寫,我可以說“ p”是一個遙遠的指針嗎? 如果我錯了,請糾正我。

C本身沒有段的概念(也沒有指針),這將是基礎實現或體系結構的一個功能(您尚未指定)。 分段體系結構和近/遠/小指針是8086年以來的古老事物-當今的大多數代碼(嵌入式東西可能除外)為您提供了一個扁平內存模型,您無需為此擔心。

所有標准狀態是字符串的實際字符將是您不允許修改的字符。

物有所值(不多)。 我的實現將字符串本身存儲在標記為只讀的內存中(這可以是也可以不是代碼段,您可以輕松地將其他段標記為只讀),並將p (這些字符中第一個字符的地址)放在在運行時堆棧。

如果運行編譯器以生成匯編器輸出:

gcc -S qq.c

您會看到類似的內容(以我的qq.s ):

        .file   "qq.c"
        .def    ___main;        .scl    2;      .type   32;     .endef
        .section .rdata,"dr"
LC0:
        .ascii "mystring\0"
        .text
.globl _main
        .def    _main;  .scl    2;      .type   32;     .endef
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        addl    $15, %eax
        addl    $15, %eax
        shrl    $4, %eax
        sall    $4, %eax
        movl    %eax, -8(%ebp)
        movl    -8(%ebp), %eax
        call    __alloca
        call    ___main
        movl    $LC0, -4(%ebp)
        movl    $0, %eax
        leave
        ret

從中可以看到,它在其自己的rdata部分(只讀數據)中,而不在text部分中。

將其放入text可能缺點是,像DEP(數據執行保護)之類的事情會更加困難。

您希望代碼和只讀數據都是只讀的,但是您也希望代碼是可執行的-通常,您希望只讀數據是可執行的。

該字符串可能會存儲在文本段中,該段將是只讀的。

如果您願意,可以說“ p是一個遙遠的指針”,但是該術語不再具有實際意義。 在過去的日子里(當時強大的80286是CPU中的內置物),那么“遠指針”具有一定的意義-基本上是指不適合單個16位地址寄存器的指針。 您需要一個地址段寄存器以及一個地址寄存器來處理令人難以置信的1 MB可尋址空間。 如今,在大多數系統((某些)嵌入式系統除外)中,這已不再相關。

暫無
暫無

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

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