【问题标题】: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 语言中,指针赋值只是说“我希望这个指针停止引用它曾经引用的内容,而是指向其他东西。”如果你真的想改变指向的值,你要么需要取消引用指针,要么调用取消引用它的函数(例如,strcpy、strcat 等)
因此,输出就是您上面列出的内容,“Hello World”完好无损。
【解决方案2】:
当您将某些内容分配给指针时,例如 ptr1 或 ptr2。你并没有改变存储在那里的值,你只是改变了它们指向的东西。
当你说:
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。
你为什么会想到这样做?尝试修改字符串文字的内容是未定义的行为。