在C中,声明像这样的char指针
char* p="Hello";
为字符串文字 Hello\0 分配一些内存 . 当我这样做之后
Hello\0
p="FTW";
分配给 Hello\0 的内存会发生什么?地址p是否指向更改?
两个语句中都没有动态内存分配 .
这些字符串存储在您的可执行文件中,加载到(可能是只读的)内存部分,只要您的进程有效 .
第二个作业只会改变 p 指向的内容 . 没有其他事情发生 .
p
内存仍由 "Hello" 占用 . 它丢失了(除非你有其他参考) .
"Hello"
地址 p 指向( p 的值)当然已更改 .
在这种情况下,“Hello”在编译时创建,并且是二进制文件的一部分 . 在大多数情况下,“Hello”存储在只读存储器中 . “FTW”也是二进制文件的一部分 . 第二次分配只会改变指针 .
此外 - 正如Met指出的那样, "Hello" 和 "FTW" 具有静态的持续时间
"FTW"
它创建一个不能修改的字符串常量,应该按原样使用 .
如果你尝试做
p[0]='m';
它会给出分段错误,因为这不是具有已分配内存的字符串文字,您可以在其中重新分配和读回值 .
如果
p = getbuffer(); getbuffer() { return buf = malloc(buf, size); }
如何在为p分配新内存之前释放这个内存!想象一下p应该多次使用getbuffer() .
6 回答
两个语句中都没有动态内存分配 .
这些字符串存储在您的可执行文件中,加载到(可能是只读的)内存部分,只要您的进程有效 .
第二个作业只会改变
p
指向的内容 . 没有其他事情发生 .内存仍由
"Hello"
占用 . 它丢失了(除非你有其他参考) .地址
p
指向(p
的值)当然已更改 .在这种情况下,“Hello”在编译时创建,并且是二进制文件的一部分 . 在大多数情况下,“Hello”存储在只读存储器中 . “FTW”也是二进制文件的一部分 . 第二次分配只会改变指针 .
此外 - 正如Met指出的那样,
"Hello"
和"FTW"
具有静态的持续时间它创建一个不能修改的字符串常量,应该按原样使用 .
如果你尝试做
它会给出分段错误,因为这不是具有已分配内存的字符串文字,您可以在其中重新分配和读回值 .
如果
如何在为p分配新内存之前释放这个内存!想象一下p应该多次使用getbuffer() .