LinuxSir.cn,穿越时空的Linuxsir!

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

[已解决]问个c语言指针的问题!

[复制链接]
发表于 2006-9-22 09:44:13 | 显示全部楼层 |阅读模式
在main中定义指针的时候

  1. (1). int *p;
  2.       *p=1;

  3. (2). int *p;
  4.       p=(int *)malloc(sizeof(int));
复制代码


这两个分配空间的方式有什么不同,各有什么优缺点?
发表于 2006-9-22 09:55:32 | 显示全部楼层
1) p没有初始化,是悬挂的指针,是错误的;
2) 是在堆上分配资源,使用完毕后需要显式回收资源:
free(p);
回复 支持 反对

使用道具 举报

发表于 2006-9-22 09:57:16 | 显示全部楼层
(1). int *p;
      *p=1;

这是错的。又没有为p指向的物件分配合适的空间,怎么能解引用p?
回复 支持 反对

使用道具 举报

发表于 2006-9-22 09:58:00 | 显示全部楼层
Post by manphiz
1) p没有初始化,是悬挂的指针,是错误的;
2) 是在堆上分配资源,使用完毕后需要显式回收资源:
free(p);

师兄动作好快啊~


ps:换头像了?
回复 支持 反对

使用道具 举报

发表于 2006-9-22 10:10:12 | 显示全部楼层
Post by Lolita
师兄动作好快啊~


ps:换头像了?

呵呵,各位都有,手痒了,干脆rob了lfs-banner~
回复 支持 反对

使用道具 举报

发表于 2006-9-22 10:12:27 | 显示全部楼层
有点不明白,为什么一定要分配呢?
好像以前学指针那章的时候,没有说一定要给*p分配空间啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-22 10:19:48 | 显示全部楼层
Post by Lolita
(1). int *p;
      *p=1;

这是错的。又没有为p分配合适的空间,怎么能解引用p?



  1. int main()
  2. {
  3.         List *L;
  4.         int i,j=10,*e;
  5.         *e=1;
  6.         //e=(int *)malloc(sizeof(int));
  7.         InitList(L);
  8.         for(i=1;i<=10;i++,j--)
  9.                 ListInsert(L,1,j);
  10.         printf("顺序表的元素为:\n");
  11.         for(i=0;i<L->length;i++)
  12.                 printf("%4d",L->elem[i]);
  13.         printf("\n");
  14.         printf("输入你想删除的元素位置(10以内的整数):\n");
  15.         scanf("%d",&i);
  16.         ListDel(L,i,e);
  17.         printf("你删除的元素是第%d个元素,值为%d。\n",i,*e);
  18.         printf("现在的顺序表为:\n");
  19.         for(i=0;i<L->length;i++)
  20.                 printf("%4d",L->elem[i]);
  21.         printf("\n");
  22.         return OK;
  23. }
复制代码

我编译和运行第1次结果都是真确的啊,但是第2次出现

  1. cho@cho:~$ ./list
  2. 顺序表的元素为:
  3.    1   2   3   4   5   6   7   8   9  10
  4. 输入你想删除的元素位置(10以内的整数):
  5. 4
  6. 你删除的元素是第4个元素,值为4。
  7. 现在的顺序表为:
  8.    1   2   3   5   6   7   8   9  10
  9. cho@cho:~$ ./list
  10. 顺序表的元素为:
  11.    1   2   3   4   5   6   7   8   9  10
  12. 输入你想删除的元素位置(10以内的整数):
  13. 7
  14. 你删除的元素是第7个元素,值为7。
  15. 现在的顺序表为:
  16.    1   2   3   4   5   6   8   9  10
  17.       6821:
  18.       6821:     calling fini: /lib/tls/i686/cmov/libc.so.6 [0]
  19.       6821:
复制代码

这个就是没分配合适的空间造成的吗?
为什么第1次不出现问题,而再运行1次就会出现了,想知道其具体原因
我是初学者,希望大家能耐心指教下,呵呵~
回复 支持 反对

使用道具 举报

发表于 2006-9-22 10:36:39 | 显示全部楼层
解引用一个未经初始化的指针或悬挂指针,其结果未定义。可能在n次测试中都没出问题,第n+1次却幽灵般出现了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-22 10:50:04 | 显示全部楼层
受教,如果
  1. List L;
  2. int i, e;
  3. ListDel(L,i,&e);
复制代码
应该就可以避免指针的问题了.
我开始学c后老想用指针,是不是 个误区啊,请版主指点迷津.
回复 支持 反对

使用道具 举报

发表于 2006-9-22 10:58:00 | 显示全部楼层
Post by alphajin
有点不明白,为什么一定要分配呢?
好像以前学指针那章的时候,没有说一定要给*p分配空间啊?
谁教的,你就:beat ,

不过要明白,这样也是可以的:
  1. int i = 10;
  2. int *p = &i;
复制代码
这时p指向i的地址,实际上*p就是引用在栈上分配给i的空间。
回复 支持 反对

使用道具 举报

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

本版积分规则

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