【问题标题】:Pointer - inquiry指针 - 查询
【发布时间】:2011-03-21 09:44:40
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main( void ) {
   char *ptr1 = "Hello World\n";
   char *ptr2;

   ptr2 = ptr1 + 6;
   ptr2 = "Test!\n";

   printf("%s",ptr2);
   printf("%s",ptr1);

   return EXIT_SUCCESS;   
}

输出:

Test!
Hello World

为什么我没有收到Hello Test!? 我以为 id 会覆盖 ptr1 中的 World-part。

【问题讨论】:

  • 我相信你能写出比这更好的标题。

标签: c pointers memory-address


【解决方案1】:

线

ptr2 = "Test!\n";

不会改变ptr2指向的缓冲区的内容。相反,它只是改变了ptr2 指向的内容。在 C 语言中,指针赋值只是说“我希望这个指针停止引用它曾经引用的内容,而是指向其他东西。”如果你真的想改变指向的值,你要么需要取消引用指针,要么调用取消引用它的函数(例如,strcpystrcat 等)

因此,输出就是您上面列出的内容,“Hello World”完好无损。

【讨论】:

    【解决方案2】:

    当您将某些内容分配给指针时,例如 ptr1ptr2。你并没有改变存储在那里的值,你只是改变了它们指向的东西。

    当你说:

    ptr2 = ptr1 + 6;
    

    您正在使ptr2 指向ptr1 字符串的第6 个元素。然后你说:

    ptr2 = "Test!\n";
    

    这意味着ptr2 现在指向内存中其他地方的一个新的、不同的字符串,其中包含"Test!\n"。所以你有这个:

    ptr  ------->  "Hello World\n"
    ptr2 ------->  "Test\n"
    

    现在,当您打印它们时,您会得到:

    Test!
    Hello World
    

    【讨论】:

      【解决方案3】:
      ptr2 = "Test!\n"
      

      只需将 ptr2 设置为指向一个新的字符串。从逻辑上讲,您的意思是写*ptr2 = ....,但现在您将修改只读内存中的字符串文字。您需要将ptr1 声明为char[],以便在您想修改字符串文字时将其分配到堆栈内存中。

      【讨论】:

        【解决方案4】:

        指针只是指向内存地址。

        你的作业没有写任何东西,它们只是改变ptr2 指向的位置。

        另外请注意,无论如何您都不能覆盖可执行文件中的常量字符串,否则可能会导致程序崩溃。

        【讨论】:

          【解决方案5】:

          因为:

             char *ptr1 = "Hello World\n";
             char *ptr2;
          

          此时你有两个指针,一个指向包含“Hello World”的内存位置,另一个指向未初始化,

             ptr2 = ptr1 + 6;
          

          现在 ptr2 指向 ptr1 指向的位置后 6 个字节的内存位置,在“Hello World”的“W”之外。如果你现在输出 ptr2,你会看到“World”。

             ptr2 = "Test!\n";
          

          现在 ptr2 指向一个完全不同的内存位置,其中包含“Test!”

          这就是为什么当你输出你的指针时你会看到你在做什么。

          【讨论】:

            【解决方案6】:

            因为:

               ptr2 = "Test!\n";
            

            将常量文字"Test!\n" 的地址分配给ptr2,覆盖您在上一行分配的地址。

            【讨论】:

              【解决方案7】:

              ptr2 = "Test!\n"; 现在ptr2 指向字符串文字"Test!\n". 字符串文字内容不会在任何地方被修改。

              ptr1 仍然指向"Hello World\n"

              我认为 id 会覆盖 ptr1 中的 World-part。

              你为什么会想到这样做?尝试修改字符串文字的内容是未定义的行为。

              【讨论】:

                猜你喜欢
                • 2013-11-16
                • 1970-01-01
                • 2015-08-03
                • 1970-01-01
                • 2016-01-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-31
                相关资源
                最近更新 更多