问一下基础问题:大家来讨论一下这种写法是否有错。

hfyou 2003-08-30 10:47:10
char* a = "abc";

有同事认为,编译器会在堆中申请一段内存存放"abc",然后在栈中产生一指针指向"abc"这一段内存。
这种说法正确吗?

偶记得很多年前,在学C时老师就指出指针赋值这种方法是错误的。
但写一段测试程序,却确实如上所述。

...全文
37 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
keiven 2003-08-31
  • 打赏
  • 举报
回复
楼上的说的很清楚了。
1cs1ak1 2003-08-30
  • 打赏
  • 举报
回复



char* a = "abc";//在静态存储区分配
在WINDOWS保护模式下是不能修改静态存储区内容的。任何试图修改其内容的都将错误。








njtu 2003-08-30
  • 打赏
  • 举报
回复
//这样是没有问题的
const char* a = "abc";
//这样在C++中编译通不过,类型不匹配
//在c中可以通过,但是很危险。
char * a = "abc";
//如果你想这样,就会出问题!
strcpy(a,"def");

所以最好这样写
const char * a = "abc" //const int c++
or
char a[4] = "abc"; //c style
eric8231 2003-08-30
  • 打赏
  • 举报
回复
字符串文字量是静态分配的,所以“abc”分配在data segment,而不是heap
char* a ,变量a在栈中分配

在c++的标准中,字符串文字量的类型是const char[ ]。“abc”的类型是const char[4]

所以可以用“abc”给char* a(或const char*)赋值,但试图通过a来改变“abc”就是错的(但这种错误往往在运行时出现)。
sevecol 2003-08-30
  • 打赏
  • 举报
回复
注意这里的不可写和const是有区别的.

首先const只是编译过程的定义,执行的时候可以通过其他的方法写数据
而不可写区域则不一样
sevecol 2003-08-30
  • 打赏
  • 举报
回复
这样是允许的,但是这里a所指的区域是不可写的区域.
hfyou 2003-08-30
  • 打赏
  • 举报
回复
还有,如果是
const char* a = "abc"呢?

从编译器方面讨论是对是错,为什么?
晨星 2003-08-30
  • 打赏
  • 举报
回复
对,不是堆内存。
积木 2003-08-30
  • 打赏
  • 举报
回复
嗯,楼上的说的明白
laazzy 2003-08-30
  • 打赏
  • 举报
回复
abc的空间是静态的全局空间
yzb1000 2003-08-30
  • 打赏
  • 举报
回复
没问题的啊
csj6214499 2003-08-30
  • 打赏
  • 举报
回复
我看没有什么问题
如果是
const char* a = "abc";
那肯定没有什么问题!
bigbigbigsoft 2003-08-30
  • 打赏
  • 举报
回复
如果你的程序不用修改它的值,直接定义:const char a[] = "abc"; 干嘛非要定义指针 *a简单了。
ejiue 2003-08-30
  • 打赏
  • 举报
回复
关键是abc的位置在哪里。
“指针赋值这种方法是错误的”,你老师说的对,不应该这样写。
Jinhao 2003-08-30
  • 打赏
  • 举报
回复
char* a = "abc"; 是不合法的
但为了保持兼容编译器就给它变成了
const char* a = "abc";
换句话说
char* a = "abc"; 就是 const char* a = "abc";
leechildren 2003-08-30
  • 打赏
  • 举报
回复
const char* a = "abc";
//在.net下肯定没问题。

69,368

社区成员

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

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