c语言:字符串不同的声明方式存储方式有什么不同?

无无无无无无无无 2013-05-07 10:40:45
字符串不同的声明方式存储方式有什么不同?

char *p = "hello";
char p[] = "hello";
char *p = malloc(10);

他们的存储方式有什么不同;

用 vc6 打印地址发现地址的偏差还是蛮大的,说明他们在进程空间的位置不同。

malloc 出来的应该是在堆中无法否认,char p[] 应该是函数栈中,那 char *p = "hello"; 是存储在哪里的?
...全文
240 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
承诺别再提 2013-05-10
  • 打赏
  • 举报
回复
char *p = "hello"; char p[] = "hello"; char *p = malloc(10) 第一个是存储在只读常量区的,是字面值,是只读的。 第二个如果是全局数组,则也是在全局常量区,是可修改的;如果是局部数组,则是在堆栈。 第三个是存在堆里的。
就是那个党伟 2013-05-07
  • 打赏
  • 举报
回复
楼上正解,p指向"hello"的首地址,而"hello"存在于全局静态区内,const
善良超锅锅 2013-05-07
  • 打赏
  • 举报
回复
char *p = "hello"; "hello"存储在全局静态区。当你这么声明的时候,会在全局静态区开辟片内存用来存储hello\0 会自动在hello的后面加一个结束符。 因为是静态区,不允许改变存储的内容。
liangeek 2013-05-07
  • 打赏
  • 举报
回复
char *p = "hello"; "hello"为字符串常量,p指向它的首地址。你不能修改字符串的内容。 char p[]="hello"; 是字符数组,你可以修改内容。
starytx 2013-05-07
  • 打赏
  • 举报
回复
1和3都是定义了一个字符指针,1是让这个字符指针指向一个常量字符串的字一个字符'h'的地址;3是让这个指针指向malloc开辟的10个字节的空间的首地址。 2 定义了一个字符数组,数组的内容是"hello"最后还有一个隐含的结束符'\0',数组的大小是5+1 = 6,。 3 是动态开辟的空间,需要free(p)来进行释放,否则会有内存泄露
sundq12 2013-05-07
  • 打赏
  • 举报
回复
那 char *p = "hello"; 是存储在哪里的?//存储在静态数据区种,为常量,不可改变。
AnYidan 2013-05-07
  • 打赏
  • 举报
回复
引用 1 楼 sundq12 的回复:
那 char *p = "hello"; 是存储在哪里的?//存储在静态数据区种,为常量,不可改变。
++
赵4老师 2013-05-07
  • 打赏
  • 举报
回复
提问和讨论之前请先学会使用恰当的工具软件观察! VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧