[英]what exactly happens when I do this assignment
考慮這個片段
char a[]="";
是否將NULL
指針分配給字符指針*a
?
如果不是我該如何檢查沒有字符串已被分配給a
?
是否將NULL指針分配給字符指針* a?
這里沒有字符指針 , 但是 char
的數組 a
。
a
將被定義為char
數組,並初始化為包含一個空字符串,即僅攜帶0
終止符(即一個char
)的c字符串。
如何檢查是否已將no字符串分配給a?
因此, a
將只有一個元素。 此元素比較等於'\\0'
,后者又比較等於0
。
為了測試這個
#include <stdio.h> /* for puts() */
#include <string.h> /* for strlen() */
int main(void)
{
char a[] = ""; /* The same as: char a[1] = ""; */
/* Possibility 1: */
if (0 == a[0]) /* alternatively use '\0' == a[0] */
{
puts("a is an empty string.");
}
/* Possibility 2: */
if (0 == strlen(a))
{
puts("a has length zero.");
}
}
a
將包含1個元素:
a[0] == '\0'
注意: a
不是指針。
首先, a
不是字符指針,它是char
的數組。 在某些情況下,后者會轉換為前者,但它們本質上不是同一類型。
也就是說,在此初始化中,數組a
將使用空字符串初始化。
空字符串表示,第一個元素將是終止的空字符,因此檢查數組是否包含空字符串的最簡單方法是將第一個元素與空值進行比較,例如
if (a[0] == '\0') { /*do the action*/ }
==>是否將NULL指針分配給a字符指針*a
?
數組不是指針。
為了更好地理解,請參考C標准#6.7.9p32中的示例[強調我的]
例8聲明
char s[] = "abc", t[3] = "abc";
定義“普通” 字符數組對象
s
和t
其元素用字符串文字初始化。 此聲明與char s[] = { 'a', 'b', 'c', '\\0' }, t[] = { 'a', 'b', 'c' };
數組的內容是可修改的。 另一方面,聲明
char *p = "abc";
定義
p
的類型為“指向char的指針” ,並將其初始化為指向長度為4的“ char數組”類型的對象,該對象的元素使用字符串文字進行初始化。 如果試圖使用p
來修改數組的內容,則該行為是不確定的。
所以,這句話
char a[]="";
定義char
數組對象a
其元素用字符串文字""
初始化。 請注意, ""
是包含單個字符'\\0'
的字符串文字。
上面的陳述相當於
char a[] = {'\0'};
如果省略尺寸,編譯器將根據初始值設定項的大小為我們計算尺寸(此處將為1
因為初始值設定項只有一個字符'\\0'
)。 因此,聲明與
char a[1] = {'\0'};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.