这是不好的做法吗?将指向空白字符串的指针重定向到另一个字符串?

Suv*_*yil 4 c memory memory-management

考虑这个片段,

char *p1="";
printf("p1=%p\np1=%s\n",p1,p1);

char s1[6]="abcde";
printf("s1=%p\ns1=%s\n",s1,s1);

p1=s1;

printf("p1=%p\np1=%s\n",p1,p1);
Run Code Online (Sandbox Code Playgroud)

因为,没有任何变量在堆上分配,所以在进程结束时将释放所有分配的空间.

问题:

  • 当指向它的指针被重定向到另一个字符串时,空字符串会发生什么?(根据我的基本Java知识,如果使用Java,空白字符串将有资格收集GC.这里会发生什么?)
  • 如果代码更长,空白字符串是否会不停地使用内存直到结束?
  • Valgrind不报告内存泄漏(我猜这只是指堆内存?).是否存在这种编码实践导致瓶颈的情况?

Jon*_*art 8

您的串"""abcde"住在你的可执行文件的(只读)数据部分.加载程序时会将它们加载到内存中.

当没有更多的指针指向它时,没有更多的指针指向它.就这样.

程序有很多只读数据(例如,整个程序的代码!)它并不是真正值得关注的东西.

这不被认为是内存泄漏,就像拥有一个永远不会被调用的函数不是内存泄漏一样.加载程序后,不会分配或取消分配任何内容.