C 语言 *p=0

2019-09-26 20:43:32 +08:00
 b00tyhunt3r
  char c[5]="abcde";
  char* p = c;
  p=p+2;
  *p=0;
  printf("c[0]=%c,c[1]=%c,c[2]=%c,c[3]=%c,c[4]=%c\n",c[0],c[1],c[2],c[3],c[4]);
  printf("main:%s\n",c);
  fputs(c,stdout);
  

输出:

c[0]=a,c[1]=b,c[2]=^@,c[3]=d,c[4]=e
main:ab
ab

可以看到在 p=p+2, * p= 0 后,指针 p 已经成功将 c[2]项释放,但 c[2]之后的 c[3],c[4]仍然没有被改变,

然而此时无论用 printf 还是 fputs 输出字符串 c,为何都只能输出 ab,而不是 ab^@de ?

先谢各位大佬指点!

1448 次点击
所在节点    程序员
9 条回复
GeruzoniAnsasu
2019-09-26 20:45:32 +08:00
本来想认真回一下,但是忍住了



c 语言老师想打人
thinkIn
2019-09-26 20:48:46 +08:00
C 中字符串以 0 表示结束
b00tyhunt3r
2019-09-26 20:52:33 +08:00
哎?那是说*p=0 等价于 *p = ‘/0’ 吗?
Oz2011
2019-09-26 20:53:21 +08:00
哈哈,为什么打到 e 就停止了呢,后面的内存里也有数据啊,为什么 printf 不一次性把他们都打出来
wevsty
2019-09-26 20:54:04 +08:00
@b00tyhunt3r
是的 '/0'就是数字 0
keyv
2019-09-26 20:56:41 +08:00
0 在 ascii 表示空字符,即字符串的结束符
Thoxvi
2019-09-26 21:02:13 +08:00
更正一下 '\0',
然后同一楼
thinkIn
2019-09-26 21:05:33 +08:00
@Oz2011 #4 看一下 printf 的格式控制符
philon
2019-09-26 21:11:31 +08:00
1. 静态字符串的长度是 5,但内存空间要给到 6,因为末尾有个你看不到的'\0'
2. *p=0 仅仅是赋值,不是什么释放
3. 我其实也是想吐槽下的,但是从你的代码上可以看出你可能还是个大一新生,还是鼓励下你👍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/604555

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX