很难对问题进行标题。
基本上我有一个拥有它自己结构的数组。
typedef struct Video
{
unsigned id;
char title[90];
char producer[60];
}Video;
Video arrayVideo[7];
int main()
{
scanf("%s", arrayVideo[0].title);
printf("%s", arrayVideo[0].title);
}
此代码将打印出我在scanf过程中写的任何内容。
然而这个对int main的小改动;
int main()
{
arrayVideo[0].title[90] = ("Hello");
printf("%s", arrayVideo[0].title);
}
什么都没有。控制台只输出执行时间和正常业务。没有输出"你好"
答案 0 :(得分:2)
这个问题实际上源于关于字符串指针的混淆。 char title[90]
是一个存储90 char
个字符的数组。 title
是指向该数组的第一个元素的指针,title[90]
是指向一个超过数组末尾的指针(因为数组索引从0开始,title[89]
是最后一个元素)
因此,如果我们分解这一行中的内容:
arrayVideo[0].title[90] = ("Hello");
左侧是指针类型,它指向arrayVideo
中的第一个元素,它是一个结构,然后在该结构中指向90个元素超过{的第一个元素的字符{1}},请注意这是91s元素。右侧是title
类型的字符串文字。目前,此代码只是将指针分配到数组的末尾以指向const char*
字符串文字的起始地址。它不会像您希望的那样将字符串的内容复制到数据结构中。当你编译它时,我没有从你的编译器收到警告,有点惊讶,尝试编译并启用所有警告。
要实际正确复制字符串的内容,您需要使用strcpy
,如下所示:
"hello"
此处strcpy(arrayVideo[0].title,"hello")
的目的地是strcpy
数组的开始,来源来自title
字符串文字const char*
。
答案 1 :(得分:2)
第二个给你两个警告,告诉你出了什么问题:
t.c: In function ‘main’:
t.c:14:29: warning: assignment makes integer from pointer without a cast [enabled by default]
arrayVideo[0].title[90] = ("Hello");
^
t.c:14:24: warning: array subscript is above array bounds [-Warray-bounds]
arrayVideo[0].title[90] = ("Hello");
^
第一个警告告诉您,您正在尝试将指针(对于字符串"Hello"
)存储到char
数组的单个title
中,第二个告诉您它无论如何都是出界的,所以可能会做任何事情,尽管在这种情况下它可能只是写入producer
数组的第一个字符。
道德:总是启用编译器可以发出的所有警告,并注意它们。