2016-11-12 131 views
4

所以我就好奇閱讀一些C代碼;假設我們有以下代碼:哪裏是空字符的固定長度的空字符串?

char text[10] = ""; 

C編譯器在哪裏放置空字符?

我能想到的3種可能情況下

  1. 在開始的時候,然後9個字符的任何用於在存儲器
  2. 最後,垃圾所以9個字符,然後尾隨'\0'
  3. 它與10 '\0'

的問題完全填滿它,這取決於這兩種情況下,是否有必要添加尾隨'\0'strncpy時。如果是案例2和案例3,那麼這不是必須的,但是一個好主意;如果是案例1,那麼這是絕對必要的。

是哪一個?

+0

我會帶門#3,蒙蒂。這與'strncpy()'的作用無關。它應該做的是它指定要做的事情。 –

+0

您詢問了C編譯器,但將其標記爲C和C++。 C和C++在這裏有一些不同之處,所以如果這不是你要求的,C++標籤是不合適的。 – hvd

+0

@ hvd認爲我也將C++放在那裏,因爲如何處理這兩種情況會很有趣。但你說得對;文本本身並沒有提到C++ –

回答

5

在初始化中,text陣列填充空字節(即#選項3)。

char text[10] = ""; 

相當於:

char text[10] = { '\0' }; 

在這的text第一元件被明確地初始化爲零,並且它們中的其餘的是隱式所要求的C11, Initialization 6.7.9, 21初始化爲零:

如果在大括號括起來的列表中的初始化器數量少於 是元素或聚合的成員,或者在中較少的字符用於初始化已知大小的數組的字符串字符串,其中 是數組中的元素,聚合的其餘部分應爲 ,隱含地初始化爲具有靜態存儲的持續時間的對象。

0

字符串文字""具有字符數組char[1]的類型C和const char [1]在C++中。

你可以把它想象以下方式

在C

chat no_name[] = { '\0' }; 

在C++

const chat no_name[] = { '\0' }; 

當一個字符串文字被用來初始化一個字符數組那麼它的所有字符都被用作初始值。因此,對於這個聲明

char text[10] = ""; 

你其實有

char text[10] = { '\0' }; 

陣列的所有其它字符沒有相應的初始化(除非是文字[0]的第一個字符),那麼他們將被初始化由0

從C標準(6.7.9初始化)

14的字符類別M的數組AY由字符串被初始化 字面或UTF-8字符串文字,任選在大括號。字符串常量的 連續字節(包括終止空 字符,如果有房間或如果陣列是未知大小的) 初始化數組的元素。

21如果在一個大括號內的列表更少初始化值多於 是元件或聚集體的成員,或在用於初始化的陣列的 字符串文字更少的字符已知的尺寸比有 是數組中的元素,所述聚集體的其餘部分應 初始化隱含的相同具有靜態存儲 持續時間的對象

,最後

10如果具有自動存儲持續時間的對象沒有初始化 明確地,它的值是不確定的。如果具有靜態 或線程存儲持續時間的對象未被明確初始化,則:

- 如果它具有指針類型,則將其初始化爲空指針;

- 如果它有算術類型,它被初始化爲(正或無符號)零;

- 如果它是一個聚合,每個成員根據這些規則初始化(遞歸) ,並且任何填充被初始化爲零位;

- 如果它是一個聯合,根據這些規則初始化第一個命名成員 (並遞歸),並且任何填充將 初始化爲零位;

類似的是用C++標準編寫的。

考慮到,在C您可以寫信例如通過以下方式

char text[5] = "Hello"; 
     ^^^ 

在這種情況下,字符數組將不會有終止零,因爲沒有準備的房間。 :)這是一樣的,如果你定義

char text[5] = { 'H', 'e', 'l', 'l', 'o' }; 
1

引用N1256(大致C99),由於存在之前或之後的語言不相關的變化:

6.7.8初始化

14字符類型的陣列可以是由字符串文字初始化,可選擇括在大括號中。字符串文字的連續字符(包括終止空字符,如果有空間或數組未知大小)初始化數組的元素。

""是由文字串一個字符的(其終止空字符),並且該段指出的是一個字符用於初始化數組,這意味着第一個字符被初始化爲零的元素。沒有什麼在這裏,說會發生什麼變化陣列的其餘部分的,但有:

21如果在一個大括號內的名單少初始化值多於元素或聚集的成員,或者更少的字符在用於初始化一個已知大小的數組(比數組中有元素)的字符串字面值中,聚合的其餘部分應該與具有靜態存儲持續時間的對象相同地初始化。

本段聲明其餘字符的初始化與靜態存儲持續時間相同,這意味着數組的其餘部分也被初始化爲零。

值得一提的還有就是「是否有房」在P14:

在C,char a[5] = "hello";是完全有效的過了,這種情況下也,你可能要問哪裏編譯器會將空字符。這裏的答案是:它沒有。

相關問題