LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 723|回复: 6

初学者问题

[复制链接]
发表于 2007-3-16 22:33:44 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
  char *p=malloc(10*sizeof(char));
  char a[]="fkadf\0";
  p=a;
  char b[]="hjk\0";
  printf("%s\n",a);
  strcat(b,a);
  printf("%s\n",p);
  free(p);
  printf("%s\n",b);

  return 0;
}
输出为
fkadf
adf
hjkfkadf
问p为什么会是adf而不是fkadf?
 楼主| 发表于 2007-3-16 22:38:21 | 显示全部楼层
p指向A,为什么strcat后A变短?
回复 支持 反对

使用道具 举报

发表于 2007-3-16 23:13:47 | 显示全部楼层
注意 b 的声明那一行, 思考: b 的空间有多大? strcat 后 b 需要占用多大的空间?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-17 15:32:58 | 显示全部楼层
感觉和B的空间没有关系吧,B的输出结果是正确的。
回复 支持 反对

使用道具 举报

发表于 2007-3-17 15:39:17 | 显示全部楼层
1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 int main()
  5 {
  6     char *p=malloc(10*sizeof(char));
  7     char a[]="fkadf\0";
  8     p=a; //错误用法,p指向一块开辟的空间,然后把指针又指向了别的地方,空间白白开辟?
  9     char b[]="hjk\0";
10     printf("%s\n",a);
11     strcat(b,a);
12     printf("%s\n",p);
13     free(p);  //这时候释放的不是原拉开辟的空间
14     printf("%s\n",b);
15
16     return 0;
17 }
18
19 输出adf的原因是:内存布局 ,|h|j|k|\0|\0|f|k|a|d|f|\0|\0||
20 strcat 后:|h|j|k|f|k|a|d|f|\0|\0|\0|\0|
21 覆盖了a的空间。
22 strcat不能这么用!!
23 希望楼主好好补补基本知识
回复 支持 反对

使用道具 举报

发表于 2007-3-17 18:46:38 | 显示全部楼层
Post by bloodbao
感觉和B的空间没有关系吧,B的输出结果是正确的。


等楼主想清了 b 的空间为什么导致错误的时候, 本帖的问题也就可以解决了. 要是自己想不明白就看看 gradetwo 兄的详细说明, 不过还是建议先自己想一想
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-17 21:31:18 | 显示全部楼层
感谢gradetwo 兄的指教,对堆栈的空间分配有了新的了解!
最近论坛怎老访问不了啊!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表