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