跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 求解一个简单的 C 语言的问题, 事实证明我一直是错的
未分類
29 8 月 2020

求解一个简单的 C 语言的问题, 事实证明我一直是错的

求解一个简单的 C 语言的问题, 事实证明我一直是错的

資深大佬 : Vibra 17

直接上代码

#include <stdio.h>  char *test() { //    char res[] = "hello, world"; //    return res;     return "hello, world"; }  const char *tt() {     const char *str = test();     printf("%sn", str);     return str; }  int main() {     const char *str = tt();     printf("%sn", str); } 

结果是打印了两次 hello world, 注释是两个乱码
所以, 请问 return “hello, world” 的这个存储 hello, world 的内存在什么地方

大佬有話說 (7)

  • 資深大佬 : codehz

    字符串常量区啊

  • 主 資深大佬 : Vibra

    @codehz 了解了, 之前一直不知道还有这么一个区, 感谢

  • 資深大佬 : junnplus

    你给 char res 加一个 static 就可以了,放在静态区

  • 資深大佬 : CismonX

    字符串字面量一般存储在 .rodata 区段,而用字符串字面量来初始化字符数组时,则会将其拷贝到栈,当然函数返回后栈帧被释放,所以你注释掉的那个返回值其实是一个 dangling pointer

  • 主 資深大佬 : Vibra

    @junnplus 我不知道的是还有字符串常量区, 这样可以不用加 static

  • 資深大佬 : akatquas

    你找个编译成汇编的工具,一目了然。

    常量字符串在 c 里面是有优化存储的。
    甚至你`”%sn”`这字符串也可以被存到了这个地方,取决于编译器行为。
    推荐一个网站,https://godbolt.org/

  • 主 資深大佬 : Vibra

    @akatquas 很有用, 感谢

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具