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