簡體   English   中英

在C中,將NULL指針傳遞給strcmp()時會發生什么?

[英]In C, what exactly happens when you pass a NULL pointer to strcmp()?

我已經讀過以下結果導致未定義的行為。

strcmp(foo, NULL); 

但究竟發生了什么“在引擎蓋下”,可以這么說呢? foo與垃圾數據相比? 是否取消引用NULL 導致“未定義行為”的細節是什么?

這取決於實現,可以自由地假設您的參數有效(在這種情況下不為null)。 該行為可以或可以不是從執行到執行,或從一個實現/平台到另一個實現/平台可再現。

C11在7.1.4“庫函數的使用”中非常清楚:

除非在以下詳細說明中另有明確說明,否則以下每個陳述均適用:如果函數的參數具有無效值(例如[...]空指針[...])[...],行為未定義。

7.24.4中對strcmp的描述沒有另外說明,因此行為確實未定義。

這是glibc中strcmp的當前實現:

/* Compare S1 and S2, returning less than, equal to or
   greater than zero if S1 is lexicographically less than,
   equal to or greater than S2.  */
int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  const unsigned char *s1 = (const unsigned char *) p1;
  const unsigned char *s2 = (const unsigned char *) p2;
  unsigned char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

你傳遞兩個指針,strcmp取消引用它們的內容並進行比較,直到它遇到差異或空字符。 失敗發生在不同的抽象級別,strcmp本身就沒有失敗。 許多系統在取消引用NULL指針時生成SIGSEGV標志,但這不是必需的。

請注意,ISO標准沒有定義很多東西,將實現細節留給實現。 在ISO C級別,您的示例沒有任何問題,但結果不能保證是可預測的。 (並且除非您查閱基礎系統的規則並且他們另有說明,否則不保證實際測試的准確性和可重復性。

當我們談論抽象層次時,我們不能問“如果”,因為規則是明確的並且說“不要這樣做,行為沒有在這里定義”。

暫無
暫無

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

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