[英]What is the difference between string literals and a pointer?
通常,您可以使用任何字符串文字(如char *str = "Hello"
初始化指針。 我認為這意味着"Hello"
返回'H'
的地址。 但是,以下內容是不允許的。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[64];
} Student;
Student initialization(char *str) {
//Student tmp = {}; strcpy(tmp.name, str) //(*1)This is allowed.
//Student tmp = {"Hello"}; //(*2)This is allowed.
Student tmp = {str}; //(*3)This is not allowed.
return tmp;
}
int main(void) {
(...)
}
誰能告訴我為什么允許(* 2)但不允許(* 3)的原因? 編譯此代碼將導致以下錯誤。
warning: initialization makes integer from pointer without a cast [-Wint-conversion]
Student tmp = {str};
^
所有這些情況下,您都試圖初始化一個char
數組。 現在說了以后-我們可以看到它使事情變得容易。 就像char
數組一樣,如果我們直接寫下字符串文字,它將使用字符串文字的內容初始化char
數組。
但是在第二種情況下,基本上是char
數組的字符串文字將轉換為指向它的第一個元素的指針(字符串文字的第一個字符),然后將其用於初始化char
數組。 那不管用。 請注意,即使str
是指向不是文字的char
數組的指針,這也不起作用。 由於指定的相同原因。 Standard允許直接從字符串文字進行初始化。 沒有其他辦法。
來自標准6.7.9p14
字符類型的數組可以由字符串文字或UTF-8字符串文字初始化,並可選地用大括號括起來。 字符串文字的連續字節(如果有空間或數組大小未知,則包括終止空字符)將初始化數組的元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.