字符串的C指针操作会产生意外的输出

时间:2013-06-28 10:21:00

标签: c string pointers c-strings

以下两个程序使用一些基本的指针操作。但他们表现不同。

#include<stdio.h>
#include<string.h>

int main(void){
     int a = 1;
     int b = 2;
     int *pb, *pc;
     pb = &a;
     pc = pb;
     pb = &b;
     printf("%d %d\n", *pb, *pc);
}

此程序按预期打印两个不同的数字(1和2),

#include<stdio.h>
#include<string.h>

int main(void){
     char *ptr, s[10];
     ptr = s;
     gets(s);
     printf("%s %s\n", ptr, s);
}

此程序打印相同的字符串两次,而它也必须打印不同的字符串。

为什么会出现这种差异?

gets()如何读取字符串?

5 个答案:

答案 0 :(得分:3)

第二个示例只包含一个字符串缓冲区,即数组s

ptr指向s不会以任何方式创建字符数据的第二个副本,因此当您同时打印ptrs时,会产生结果在同一个字符串中,因为它们评估的地址完全相同。

答案 1 :(得分:1)

代码运行后:

ptr = s;

ptr指向s的开头,所以当你调用printf()时,你会得到两次相同的地址 - 难怪同样的地址被打印两次。

答案 2 :(得分:1)

在第二个示例中,您只有一个数组(s)以及指向同一内存的第二个指针。这两个地址ptrs是相同的,因此当然在printf()中使用相同的输出会产生相同的结果。在第一个示例中,您有两个不同的整数,可以包含不同的值。

答案 3 :(得分:1)

因为这两个字符指针仍然指向同一个内存。您只是将数据分配给指向的内存。

但是在整数指针的情况下,你改变了第一个指针指向的内存地址。

如果你喜欢这样:

pb  = &a;
pc  = pb;
*pb = 7;

两种情况下都会打印7张。这就是你用字符指针做的。


图片说明:

当你做了pb =&amp; a; pb将指向a。的内存地址。

pb = &a

当你做pc = pb; pb&amp; pc将指向a。的内存地址。

pc = pb

当你做了pb =&amp; b; pb将指向b的内存地址。但是pc仍然会指向a。的内存地址。

pb = &b

免责声明:我附上图片的答案,SO中存在一些技术问题。这就是3张图像没有显示的原因。查看https://meta.stackexchange.com/questions/186466/intermittent-error-with-imgur-when-uploading-images

答案 4 :(得分:0)

  

此程序打印相同的字符串两次,而且还必须打印不同的字符串。

绝对不能。在第一个示例中,指针指向不同的对象。在第二个中,显式指针和一个s衰减到指向内存中的相同数组(显然......)