0

在 C 中,像这样声明一个 char 指针

char* p="Hello";

为字符串文字分配一些内存Hello\0。当我之后这样做时

p="FTW";

分配给的内存会发生什么Hello\0?p 指向的地址是否改变了?

4

6 回答 6

10

这两个语句中都没有动态内存分配。

这些字符串存储在您的可执行文件中,加载在内存的(可能是只读的)部分中,该部分将与您的进程一样长。

第二个任务只改变p指向的内容。没有其他事情发生。

于 2012-05-16T07:47:44.533 回答
0

内存仍然被 占用"Hello"。它丢失了(除非您有其他引用它)。

p指向的地址(的值p)当然会改变。

于 2012-05-16T07:48:20.573 回答
0

在这种情况下,“Hello”是在编译时创建的,并且是二进制文件的一部分。在大多数情况下,“Hello”存储在只读存储器中。“FTW”也是二进制文件的一部分。第二次赋值只会改变指针。

于 2012-05-16T07:48:41.433 回答
0

此外 -正如大都会指出的那样"Hello",具有静态存储持续时间"FTW"

于 2012-05-16T07:49:55.307 回答
0

它创建了一个无法修改的字符串常量,应该按原样使用。

如果你尝试做

p[0]='m';

它会给出分段错误,因为这不是具有分配内存的字符串文字,您可以在其中重新分配和读回值。

于 2012-05-16T10:03:07.407 回答
-1

如果

p = getbuffer();

getbuffer()
{
   return buf = malloc(buf, size);
}

在将新内存分配给 p 之前如何释放此内存!想象一下 p 应该多次使用 getbuffer() 。

于 2014-08-17T07:08:34.037 回答