簡體   English   中英

我完成這項作業后會發生什么

[英]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"; 

定義“普通” 字符數組對象 st其元素用字符串文字初始化。 此聲明與

  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.

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