Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印三个内容相同的字符串会得到不同的结果_C_Arrays_Gcc - Fatal编程技术网

C 打印三个内容相同的字符串会得到不同的结果

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

我使用gcc 4.8.2编译此代码,让我困惑的是它为什么会打印:

> root@ubuntu:~./main

我认为应该打印:

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?