C 打印三个内容相同的字符串会得到不同的结果
我使用gcc 4.8.2编译此代码,让我困惑的是它为什么会打印: > root@ubuntu:~./main 我认为应该打印:C 打印三个内容相同的字符串会得到不同的结果,c,arrays,gcc,C,Arrays,Gcc,我使用gcc 4.8.2编译此代码,让我困惑的是它为什么会打印: > root@ubuntu:~./main 我认为应该打印: 0x7fff7124273d 111 0x7fff7124273e 11 0x7fff7124273f 1 您能帮助我吗?因为数组的大小是1,并且您正在为长度为2的数组分配字符串文字,因此在结尾还有空字符\0。因此,指针指向的字符串可能不是以NULL结尾的字符串。您需要大小为2的数组 0x7fff7124273d 1 0x7fff7124273e 1 0x7
0x7fff7124273d 111
0x7fff7124273e 11
0x7fff7124273f 1
您能帮助我吗?因为数组的大小是1,并且您正在为长度为2的数组分配字符串文字,因此在结尾还有空字符\0。因此,指针指向的字符串可能不是以NULL结尾的字符串。您需要大小为2的数组
0x7fff7124273d 1
0x7fff7124273e 1
0x7fff7124273f 1
或
另外,不要在C中使用void main。请使用int main。因为数组的大小为1,并且您正在分配长度为2的数组字符串文本的末尾也有空字符\0。因此,指针指向的字符串可能不是以NULL结尾的字符串。您需要大小为2的数组
0x7fff7124273d 1
0x7fff7124273e 1
0x7fff7124273f 1
或
另外,不要在C中使用void main。请使用int main
这样初始化字符数组是合法的,但它不是字符串,因为它不是以null结尾的
%printf中的s需要一个字符串,因此您所做的是未定义的行为
我的猜测是,编译器把变量放在一起,它们后面的字节恰好是0,这可以解释发生了什么。但同样,这是未定义的行为,任何事情都可能发生
char firstName[1] = "1";
这样初始化字符数组是合法的,但它不是字符串,因为它不是以null结尾的
%printf中的s需要一个字符串,因此您所做的是未定义的行为
我的猜测是,编译器把变量放在一起,它们后面的字节恰好是0,这可以解释发生了什么。但同样,这是未定义的行为,任何事情都可能发生
char firstName[1] = "1";
1实际上是两个字节的大小-'1','\0'-您忘记了C字符串以null结尾。初始化会将空字节丢弃。您的数组需要足够大,以包含初始值设定项中的所有数据,以避免出现这种情况。1实际上是两个字节大小-“1”,“0”-您忘记了C字符串以null结尾。初始化会将空字节丢弃。要避免这种情况,数组需要足够大,以包含初始值设定项中的所有数据。请记住,C样式字符串是以null结尾的数组,这意味着字符串后面应该有“\0”。可能对您有所帮助的注意事项:
char firstName[2]=1;-单独添加“\0”,请注意2而不是1。
char firstName[]={'1'}-不添加'\0'。
char firstName[2]={'1'}-添加'\0'。
获取此输出可能是因为字符放在一起,这是未定义的行为。请记住,C样式字符串是以null结尾的数组,这意味着字符串后面应该有“\0”。可能对您有所帮助的注意事项:
char firstName[2]=1;-单独添加“\0”,请注意2而不是1。
char firstName[]={'1'}-不添加'\0'。
char firstName[2]={'1'}-添加'\0'。
您之所以获得此输出,可能是因为字符放在一起,这是未定义的行为。在您的代码中
'1' '1' '1' 0
^ ^ ^
firstName | |
middleName |
lastName
首先打印的是数组名的基址
第二件事实际上是未定义的行为。要使任何字符数组成为字符串,其结尾必须有空字符\0。数组长度仅为1个字符,包含“1”。所以你不能用%s来打印它
使用%c而不是%s来打印字符,如\
printf("%p\t%s\n",firstName,firstName);
在代码中
'1' '1' '1' 0
^ ^ ^
firstName | |
middleName |
lastName
首先打印的是数组名的基址
第二件事实际上是未定义的行为。要使任何字符数组成为字符串,其结尾必须有空字符\0。数组长度仅为1个字符,包含“1”。所以你不能用%s来打印它
使用%c而不是%s来打印字符,如\
printf("%p\t%s\n",firstName,firstName);
在C语言中,字符串以NUL结尾,即字符串1是字符{'1',0}。您没有为终止符留出足够的空间,因此字符串被截断,printf不知道它们的结束位置 最好将其定义为
printf("%p\t%c\n",firstName,firstName);
而且是最好的
char firstName[2] = "1";
因此,如果您处理的名字超过1个字符,编译器将为您计算适当的内存量。在C中,字符串以NUL结尾,即字符串1是字符{1',0}。您没有为终止符留出足够的空间,因此字符串被截断,printf不知道它们的结束位置 最好将其定义为
printf("%p\t%c\n",firstName,firstName);
而且是最好的
char firstName[2] = "1";
因此,如果您需要处理一些名字长度超过1个字符的字符,编译器将为您计算适当的内存量。为字符数组分配2个字节,而不是1个字节。始终必须为“\0”字符串终止符或字符串应以“\0”终止的成员保留1个额外的字符。数组中没有足够的空间\0更改为char firstName[]=1;。所有人都一样。谢谢大家,我理解。:)为字符数组分配2字节而不是1字节。始终必须为“\0”保留1个额外字符
'字符串终止符请记住字符串应以'\0'终止。数组中没有足够的空间\0更改为char firstName[]=1;。所有人都一样。谢谢大家,我理解。:)第二个和第三个例子完全相同。第二个和第三个例子完全相同。修正了打字错误。您确定“\0”!=char0?修正了打字错误。您确定“\0”!=char0?