簡體   English   中英

LOGICALLY存儲的char-pointing字符串在哪里?

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

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