这样为什么也能过?

yuefy520 2012-01-08 02:10:09

#include <stdio.h>

int main(void)
{
char * p;
p = "abcdefg";

printf("%s", p);

return 0;
}


为什么这样编译也能通过?不解?明明没有分配内存?真的不解!还是字体串处理不同?还是我对指针没有理解透?我用的是vc++6.0.
...全文
195 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
liubingqian 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 betalker 的回复:]

引用 3 楼 yuefy520 的回复:

是不是分配了.但是不能修改了是吧?


可以修改的。
C/C++ code

//……
char c = 'd';
p = "abcdefg"; /* 此时,p指向的是字符串常量(const char[])。对字符串常量的修改,在c标准中是为未定义的,有的编译器可以修改,有的不可以,所以,结果不知*/
pr……
[/Quote]
你都知道“结果不知”、“未定义”了,就别误导人家说是可以修改的了。
awl005 2012-01-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tanqing900920 的回复:]

谁说可以修改的?char *p = "abcd";将p 指向 &c,那么就再也找不回"abcd",同理指向&c的P改变了,就再也找不回c了......,你这个程序是指运行那么下,要是SERVER,一年到头来不停机,有那么点内存泄露的意味,能跑是因为OS帮你回收了MEM了,眼见不一定是真的。。。。。
[/Quote]

这个是不会泄漏的
char* p="abcd";
char c;
p=&c;
p="abcd"; // 这个还是原来的那个"abcd"
char* p2="abcd" //这个也是上面的那个"abcd"
{
char* lp="abcd"; //这个还是那个"abcd"
}
cout<<(int*)p<<endl<<(int*)p2<<endl<<(int*)lp<<endl<<(int*)"abcd"<<endl; //你会发现是一样的地址
一介丶草民 2012-01-09
  • 打赏
  • 举报
回复
只是常量赋值抄作,可以的,
赵4老师 2012-01-09
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
yuefy520 2012-01-08
  • 打赏
  • 举报
回复
谢谢你们!嘿嘿!菜鸟慢慢步入初级了.大家加油!一起进步!知识也是一点一点的积累!也有人别一想天开说7天入门.30天成高手.还是实打实的学好些!
「已注销」 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kimshuen 的回复:]

引用 5 楼 betalker 的回复:
引用 3 楼 yuefy520 的回复:

是不是分配了.但是不能修改了是吧?


可以修改的。

C/C++ code


//……
char c = 'd';
p = "abcdefg"; /* 此时,p指向的是字符串常量(const char[])。对字符串常量的修改,在c标准中是为未定义的,有的编译器可以修改,有的不可……
[/Quote]

就是这个意思,表达错误。
差点害人。
yuefy520 2012-01-08
  • 打赏
  • 举报
回复
完全理解,"abcdefg" 这个又叫做匿名常量字符串.是存储在静态区,和1,2,3,4这些常量一样.不可以修改的.p是指针变量,地址指向"abcdefg",所以p的地址可以修改.
Kimshuen 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 betalker 的回复:]
引用 3 楼 yuefy520 的回复:

是不是分配了.但是不能修改了是吧?


可以修改的。

C/C++ code


//……
char c = 'd';
p = "abcdefg"; /* 此时,p指向的是字符串常量(const char[])。对字符串常量的修改,在c标准中是为未定义的,有的编译器可以修改,有的不可以,所以,结果不知*/
……
[/Quote]
这种说法不对哈,执行p=""abcdefg"; p是一个指向常量的指针,p并不是常量,p的值是可以修改的,但是*p的值是不可以修改的。如下所示:
#include<stdio.h>
int main()
{
char *p;
p="abcdefg";
printf("%s\n",p);
*(p+0)='c';
printf("%s\n",p);
return 0;
}

自己运行看结果哈
tanqing900920 2012-01-08
  • 打赏
  • 举报
回复
谁说可以修改的?char *p = "abcd";将p 指向 &c,那么就再也找不回"abcd",同理指向&c的P改变了,就再也找不回c了......,你这个程序是指运行那么下,要是SERVER,一年到头来不停机,有那么点内存泄露的意味,能跑是因为OS帮你回收了MEM了,眼见不一定是真的。。。。。
小班得瑞 2012-01-08
  • 打赏
  • 举报
回复
你去花一个礼拜时间好好看下《C和指针》,就会明白其中道理
zzijia 2012-01-08
  • 打赏
  • 举报
回复
各种正解
建鼎呓语 2012-01-08
  • 打赏
  • 举报
回复

char * p;
p = "abcdefg";

编译器应该会有警告或错误,这是把const char *转为char *
IVERS0N 2012-01-08
  • 打赏
  • 举报
回复
和char *p="abcdefg"没区别啊 常量字符串
yuefy520 2012-01-08
  • 打赏
  • 举报
回复
看样子老谭的书还有很多误人的东西!
Kontrol 2012-01-08
  • 打赏
  • 举报
回复
估计你还是没用弄明白指针的含义吧~~其实你使用p="abcdefg"的时候,"abcdefg"为一个常量,会给它分配一个内存的,然后当你使用p="abcdefg"时,此时指针p指向的就是这块内存区域。所以这样是可以通过的~~
jenicooper 2012-01-08
  • 打赏
  • 举报
回复
在常量区分配了内存,能否修改依编译器而定,正常情况下修改是不合法的,也不会是程序员自己想要的结果。
「已注销」 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yuefy520 的回复:]

是不是分配了.但是不能修改了是吧?
[/Quote]

可以修改的。

//……
char c = 'd';
p = "abcdefg"; /* 此时,p指向的是字符串常量(const char[])。对字符串常量的修改,在c标准中是为未定义的,有的编译器可以修改,有的不可以,所以,结果不知*/
printf("%s\n", p);

p = &c;
printf("%c\n", &p);

p = "abcd";
printf("%s\n", p);
//……
iamnobody 2012-01-08
  • 打赏
  • 举报
回复
上面我的说法也不够全面,楼主还是找本好书看看,不要看老潭的书,然后你就会发现根本没有分配一说。一个指针对象所占的内存就跟int 之类的是一样的
yuefy520 2012-01-08
  • 打赏
  • 举报
回复
是不是分配了.但是不能修改了是吧?
iamnobody 2012-01-08
  • 打赏
  • 举报
回复
到底是什么书说指针要分配内存才能用的???

指针只要合理的初始化或赋值,指向一个有效的对象就可以使用!、
p = "abcdefg";

"abcdefg"是一个匿名字符数组,数组名可以隐式转换成首元素的指针,于是p就被赋值为这个匿名数组的收元素指针。
加载更多回复(1)

69,373

社区成员

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

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