簡體   English   中英

帶有字符串文字的C空指針

[英]C null pointer with string literals

使用ARM,C編譯器,我可以成功編譯並運行以下代碼:

static char * myString = 0;

void myfunc(int x){

   if (x <= 0)
       myString = "Hello World";
   else 
       myString = "This is a different string with a different length";

}

int main(){

    myfunc(-1);
    printf("%s\n", myString);
    myfunc(2);
    printf("%s\n", myString);
}

為什么這樣做?

指針不應該是NULL指針嗎?

至少,不應該在只讀內存位置分配字符串文字嗎?

編輯:它是一個C ++編譯器

EDIT2:為什么在myfunc超出范圍后,字符串文字存在於靜態范圍內? 字符串文字是否未在堆棧中聲明? 什么時候他們被解除分配?

謝謝!

這兩個字符串在只讀存儲器中分配,並且完全不同。 但是你用一個相同的指針指向它們中的每一個......什么是不明白的?

記住, char*只是一個指針。 它是可變的(非常數)。

char* p = 0;
p = "Hello"; //OK
p = "Jo" //OK;
p[0] = 'X' //OOPS, now THIS is bad (undefined behavior)

編輯后:

不,字符串文字具有靜態存儲持續時間(與所有其他文字不同),它們不是在堆棧上創建的。 它們將存在直到程序終止。

如果你要宣布

char const *MyString = 0;  

然后你會遇到麻煩,因為const指針無法重新分配。 字符串文字是常量。

       .section        .rodata
.LC0:
        .string "Hello World"
        .align 8
.LC1:
        .string "This is a different string with a different length"
        .text

文字字符串數據匯編在只讀數據部分中。

常量字符串通常在程序的“數據段”中創建,並且指向它們的指針始終有效(字符串“對象”對程序生命周期有效)。 所以不行。 不在堆棧上創建文字字符串。

我相當肯定語義在C中定義明確。

快樂的編碼。

它是,但是你為它指定了一個指向字符串文字的指針,因此它指向兩個字符串數組中的一個。

最初它是一個空指針。 但是你自己明確地改變了那個指針並使它在myfunc函數中變為非null。

在第一次調用myfunc你明確地使指針指向字符串文字"Hello World" 在那之后,指針當然不再為空。

字符串文字確實分配在只讀存儲器位置(至少在概念上)。 但是,在C和C ++中,您可以使用char *指針指向字符串文字(即不需要const char * )。 它是確定只是指向字符串字面量char *指針,只要你是不是要修改文字。 您的代碼不會嘗試修改任何內容,所以沒關系。

C和C ++中的字符串文字具有靜態存儲持續時間。 所以不,他們沒有被“分配”。 它們總是分配在靜態內存中,這意味着它們永遠存在 - 只要程序正在運行。

PS為了更完整地回答你的問題,你必須解釋為什么在地球上你希望你的指針保持為空。

PPS int main ,而不是void main

myString是一個指針變量,你故意將它設置為指向存儲兩個字符串常量之一的內存。

暫無
暫無

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

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