在char*var中分配的内存;公告

在char*var中分配的内存;公告,c,string,cstring,string-literals,C,String,Cstring,String Literals,在C语言中,像这样声明一个字符指针 char* p="Hello"; 为字符串文字Hello\0分配一些内存。当我事后这么做的时候 p="FTW"; 分配给Hello\0的内存会发生什么变化?p点的地址是否要更改?这两条语句中都没有动态内存分配 这些字符串存储在您的可执行文件中,加载到内存的一个可能的只读部分,该部分将与您的进程一样长 第二个赋值只改变p指向的内容。没有其他事情发生。内存仍被Hello占用。除非您有其他参考资料,否则它将丢失 地址p指向p的值当然会改变。在这种情况下,Hell

在C语言中,像这样声明一个字符指针

char* p="Hello";
为字符串文字Hello\0分配一些内存。当我事后这么做的时候

p="FTW";

分配给Hello\0的内存会发生什么变化?p点的地址是否要更改?

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

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


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

内存仍被Hello占用。除非您有其他参考资料,否则它将丢失


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

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

此外-Hello和FTW具有Met所指出的静态存储持续时间。

它创建了一个不能修改的字符串常量,应按原样使用

如果你试着做

p[0]='m';
这将导致分段错误,因为这不是分配内存的字符串文字,您可以在其中重新分配和读取值。

如果

p = getbuffer();

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

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

所以如果我继续给p分配更多的值,我只会浪费内存读取作为内存泄漏?如何使用动态内存呢?你没有泄漏任何东西-这些字符串从程序开始到结束都存在。如果您使用像malloc这样的动态内存分配,那么您应该释放它。如果你不这样做,你就不能释放他们。在上面的语句之后释放p很可能是一个bug和崩溃。我的意思是泄漏内存,因为内存中的内存被浪费了,因为Hello不再被使用,不再是免费的。我重复一遍:您没有使用这些语句泄漏内存。这些字符串是您流程的一部分。如果您自己手动调用malloc或另一个动态分配函数,但没有释放,则会发生泄漏。它是由垃圾清理丢失的?C中没有垃圾收集。哦,是的,我读丢失是因为内存丢失,但这一定意味着它的引用丢失了,因为您还提到了内存仍然被占用。它不会可靠地导致分段错误。它是未定义的行为,因此可能只是根据编译器及其选项工作。谢谢undur_gongor。你能指出一个推荐人吗?当时我的电脑正对着gcc,出现了seg故障。我记得同样的情况也会发生在VS上,因为我以前在windows中的VS上遇到过这种情况。您提到了未定义的行为,就好像它是有文档记录的一样。我真的很想了解情况——ThanksISO/IEC 9899:1999在其附录J.2中列出了未定义行为的原因,包括程序试图修改字符串文字。更重要的是,在6.4.5字符串文本中,它说:如果程序试图修改这样的数组,行为是未定义的。本标准的草案版本可在以下网址获得:。