簡體   English   中英

在下面的C代碼中遇到分段錯誤?

[英]Getting a segmentation fault in the below C code?

為什么在下面給出的代碼中出現分段錯誤?

char getstr()
{
  static char s[]="Hiii2015";
  return s;
}

int main()
{
  printf("%s",getstr());
  return 0;
}

雖然我知道我要使用char返回類型返回地址,並且返回類型必須為char*但是仍然只能這樣做,否則我在gcc編譯器上會得到null並在另一個編譯器上遇到分段錯誤,所以這是什么原因這個

您的getstr()返回類型錯誤。

它只是char ,應為const char *char * (即指針)。

照原樣,您將返回的指針壓縮為char (可能只有8位),然后嘗試從printf()訪問該非常低的地址會給您帶來不確定的行為。

您應該已經為此收到編譯器警告。

我在gcc編譯器上得到null並且在另一個編譯器上出現分段錯誤

未定義行為的非常深刻的跡象。 在您的代碼中

printf("%s",getstr());

實際上會調用未定義的行為 ,因為提供的參數不是提供的格式說明符期望的正確類型。

為了對此進行詳細說明,請引用C11標准第6.8.6.4章, return語句,

如果執行帶有表達式的return語句,則表達式的值將作為函數調用表達式的值返回給調用方。 如果表達式的類型不同於它所出現的函數的返回類型,則該值的轉換就好像是通過分配給具有函數的返回類型的對象一樣。

因此,返回s就像轉換為char ,表示錯誤的值。 該值作為%s的參數提供時,會通過UB創建所有問題。

遇到UB時,既不能保證也不可以預測行為。

暫無
暫無

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

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