通常,您可以使用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};
^
答案 0 :(得分:3)
您尝试初始化char
数组的所有这些情况。现在说完之后 - 我们可以看到它让事情变得更容易。就像char
数组一样,如果我们直接写下字符串文字,它会使用字符串文字的内容初始化char
数组。
但是在第二种情况下,基本上是char
数组的字符串文字被转换为指向它的第一个元素的指针(字符串文字的第一个字符),然后用于初始化{{ 1}}数组。那样不行。请注意,即使char
是指向不是文字的str
数组的指针,这也不起作用。出于与指定相同的原因。 Standard允许直接从字符串文字初始化。不是其他方式。
来自标准6.7.9p14
字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选择用大括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。