[英]Where is a char-pointing string stored LOGICALLY?
在C中,我們可以使用char *指向一個字符串。 就像
char *s = "Hello";
。
可以看出,變量不是動態定位在堆上,因為沒有像malloc這樣的動態函數,也沒有定義為指向某個其他變量。
所以我的問題是, 變量[char * s]指向邏輯存儲的文字字符串在哪里?
它是否像任何普通的局部變量一樣存儲在堆棧中? 或者像堆棧這樣的東西?
實際上,我是計算機工程系的畢業生,但我沒有發現並且對於[char * string]邏輯上的工作方式過於好奇。 現在非常榮幸地提出這個問題。
變量char* s
存儲在堆棧中,假設它在函數體中聲明。 如果它在類中聲明,則它存儲在存儲類的對象的任何位置。 如果它被聲明為全局,那么它將存儲在全局內存中。
事實上,任何非static
和非thread_local
你在這三個位置聲明變量行為相同的方式,無論它是否是一個原始(即int
),對象(即vector<int>
),或指針(即const char*
)。 如果變量是靜態的,則它始終存儲在全局空間中。 如果變量是thread_local
,則每個線程都獲得自己的副本,並且該副本通常存儲在相應線程的堆棧基礎中。
實際字符串"Hello"
,其中s
點,存儲在一個恆定的全球空間的地方,通常是.data
段。
字符串文字具有靜態存儲持續時間 。 這意味着它們存在於程序的整個生命周期中。 它們可能存儲在不可寫區域中,並且可能與其他字符串文字重疊。 同一文字的兩個不同實例可能重合也可能不重合。
這取決於您的實現(編譯器/鏈接器/等)。 做出符合這些要求的決定。
關於s
沒什么特別s
,它是一個指針,它指向某個地方。 它具有自動存儲持續時間 ,就像任何其他未聲明static
局部變量一樣 然而,什么是“特殊”是你指向的字符串文字。
您可以將字符串文字視為"foo"
作為具有一些特殊約束的未命名全局變量 。 這些限制是:
const
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.