簡體   English   中英

字符串文字和指針之間有什么區別?

[英]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.

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