【问题标题】:C pointer manipulation for strings gives unexpected output字符串的 C 指针操作给出了意外的输出
【发布时间】:2013-06-28 10:20:59
【问题描述】:

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

#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() 如何读取字符串?

【问题讨论】:

  • “它必须有”...什么?为什么?
  • 我感觉你根本不知道指针到底是什么......
  • “而它也必须打印不同的字符串”——废话;它显然会打印两次相同的字符串。 “为什么会有这种差异?” -- 因为它们是完全不同的程序。

标签: c string pointers c-strings


【解决方案1】:

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

使ptr 指向s 无论如何都不会创建字符数据的第二个副本,因此当您同时打印ptrs 时,它们会产生相同的字符串,因为它们的计算结果为完全相同的地址。

【讨论】:

    【解决方案2】:

    在您的代码运行后:

    ptr = s;
    

    ptr 指向s 的开头,因此当您调用printf() 时,您会得到相同的地址两次传递 - 难怪相同的地址被打印两次。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        如果你这样做了:

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

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


        图片说明:

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

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

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

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

        【讨论】:

          【解决方案5】:

          这个程序两次打印相同的字符串,但它也必须打印不同的字符串。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-11
            • 2020-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多