LinuxSir.cn,穿越时空的Linuxsir!

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

请教:关于在函数中调用malloc返回的指针不能使用(具体看里面)

[复制链接]
发表于 2005-3-14 13:49:48 | 显示全部楼层 |阅读模式
在函数中调用malloca返回的指针为何不能使用?

[PHP]#include <stdio.h>

int
fun(char *p)
{
  int i;
  p = (char *)malloc(10 * sizeof(char ));
  for (i = 0; i<10; i++)
    {
      p='h';
    }
  printf("%s\n", p);
  return 0;
}


int
main(int argc, char *argv[])
{
  int i;
  char *a;
  fun(a);
  for (i=0; i< 10; i++)
    {
      a = 'g';
    }
  printf("%s\n", a);
  return 0;

}[/PHP]
编译:gcc -o test test.c
输出为:
[PHP]#./test
hhhhhhhhhh
段错误[/PHP]
发表于 2005-3-14 14:02:33 | 显示全部楼层
一个基本的错误,main函数中参数a传给函数fun,无法产生预期的结果。
回复 支持 反对

使用道具 举报

发表于 2005-3-14 16:18:44 | 显示全部楼层
函数fun的参数p是在栈里产生的一个新变量,不是在main里传进去的a,因此对p的赋值对a没有影响,a仍是一个没有空间的指针。要想改变a,可以这样:


  1. #include <stdio.h>

  2. int
  3. fun([color=Red]char **p[/color])
  4. {
  5.   int i;

  6.   [color=Red]*p[/color] = (char *)malloc(10 * sizeof(char));

  7.   for (i = 0; i<9; i++) {
  8.       [color=Red](*p)[/color][i]='h';
  9.   }
  10.   [color=Red](*p)[/color][9] = '\0';
  11.   printf("%s\n", [color=Red]*p[/color]);

  12.   return 0;
  13. }


  14. int
  15. main(int argc, char *argv[])
  16. {
  17.   int i;
  18.   char *a;

  19.   fun([color=Red]&a[/color]);

  20.   for (i=0; i<9; i++) {
  21.       a[i] = 'g';
  22.   }
  23.   a[9] = '\0';
  24.   printf("%s\n", a);

  25.   return 0;
  26. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-3-14 16:24:13 | 显示全部楼层
a根本就没有初始化
指向的是0地址(系统空间)
自然不能赋值
回复 支持 反对

使用道具 举报

发表于 2005-3-14 16:38:59 | 显示全部楼层
a 可不一定是零哦:)
回复 支持 反对

使用道具 举报

发表于 2005-3-14 16:49:01 | 显示全部楼层
Post by nait
a根本就没有初始化
指向的是0地址(系统空间)
自然不能赋值

main函数中的a 是自动变量,不会被系统自动初始化为0。只有全局变量和静态变量才会被自动初始化为0。
回复 支持 反对

使用道具 举报

发表于 2005-3-14 19:32:39 | 显示全部楼层
Post by kj501
main函数中的a 是自动变量,不会被系统自动初始化为0。只有全局变量和静态变量才会被自动初始化为0。

理论如此
但实际用gdb跟踪一下就可看出a的值是零
回复 支持 反对

使用道具 举报

发表于 2005-3-14 21:46:10 | 显示全部楼层
同意3楼的朋友
其实无论传值还是传址, 传过去的实参都要被copy一份, 只是如果传的是指针,由于副本(copy后的)与原本(实参)指向同一地址,表现为"传址"

另外没有初始化的指针到底指向那里是否有编译器的原因, 请大家指教
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-14 23:19:17 | 显示全部楼层
明白了,谢谢各位
回复 支持 反对

使用道具 举报

发表于 2005-3-15 08:51:43 | 显示全部楼层
Post by nait
理论如此
但实际用gdb跟踪一下就可看出a的值是零

理论上讲,有限次地看到是 0 说明不了什么问题,你再跟踪一下这个程序中的 a 是不是 0 ?

  1. #include <stdio.h>

  2. void func1(int x, int y, int z)
  3. {
  4.         return;
  5. }

  6. void func2(void)
  7. {
  8.         [color=Red]char *a;[/color]

  9.         printf("a = %d\n", a);
  10.         return;
  11. }

  12. int main(void)
  13. {
  14.         func1(5, 6, 7);
  15.         func2();
  16.         return 0;
  17. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

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