我是新手。我在数组中做了一些实验。我试过这个
#include <stdio.h>
int main()
{
char arr[7] = "Network";
printf("%s\n", arr);
return 0;
}
输出网络
我也试过了,
int main()
{
char arr[7] = "Its time to work";
printf("%s\n", arr);
return 0;
}
警告:字符数组的初始化字符串太长[默认情况下启用]
输出:**它的时间
我有这个版本的gcc -v gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04.3)
为什么首先没有警告?为什么它给我输出'网络'代替垃圾或'网络',如果'%s'在第二种情况下最后追加'\ 0'?
答案 0 :(得分:1)
在两个示例中,您使用字符串文字作为字符数组的初始值设定项。虽然它是隐式的,但字符串文字总是附加一个空字符。
C99,n1570 (downloadable here) 第6.4.5节字符串文字,第14段。 6说:
在转换阶段7中,附加值为零的字节或代码 每个由字符串文字产生的多字节字符序列 或文字。
此外,(信用于@Olaf)部分 6.7.9初始化,第7段。 14 它说:
字符类型数组可以由字符串初始化 文字或UTF-8字符串文字,可选择用大括号括起来。 字符串文字的连续字节(包括终止空值) 字符 如果有空间 或者数组的大小未知) 初始化数组的元素。 [ 强调 我的]
即使不明显,字符串文字初始值设定项2 name1
1 name2
包含8个字符,而变量"Network"
只有7个空格:
arr
因为你的陈述:
"Network" -> |N|e|t|w|o|r|k|0|
char arr[7] -> | | | | | | | |
在 char arr[7] = "Network";
中没有提供足够的空间,它会创建一个arr
数组,不会创建字符串。将其用作字符串将导致 undefined behavior 。即任何事情都可能发生。
答案 1 :(得分:0)
基于我对这个帖子的学习
#include <stdio.h>
int main()
{
char arr[7] = "Network";
//printf("%s\n", arr);
return 0;
}
是一个有效的计划。使用%s打印不是。它应该被视为一个字符数组。
int main()
{
char arr[7] = "Its time to work";
printf("%s\n", arr);
return 0;
}
程序员在分配任何值时检查数组的大小是一个错误的程序。