Jean__X
Jean__X
采纳率100%
2017-11-08 07:39

为什么c程序传入一个未初始化的指针给函数会导致程序崩溃,而传未初始化指针的地址给函数却不会呢?

已采纳

比如:
typedef char* Elem_ptr
1、导致崩溃的情况
void Function(Elem_ptr c,int n){_
c = (Elem_ptr)malloc(n*sizeof(char));
}
//主函数
Elem_ptr s;int i;Function(s,i);
2、不会导致崩溃的情况
void Function(Elem_ptr *c,int n){
(*c) = (Elem_ptr)malloc(n*sizeof(char));
}
//主函数
Elem_ptr s;int i;Function(&s,i);

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • u012613386 种兔子的地瓜 4年前

    c的函数是值传递,传入一个未初始化的指针,其实是传的指针的值(就是指针变量存的地址);取指针的地址传递,才能真正将指针传过去。

    点赞 3 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 4年前

    要搞清楚程序为什么“崩溃”。c语言作为一种原始而简陋的语言,它本身不会有任何对内存访问是否存在异常的判断(现代的c语言在运行库层面也会有一些判断,不在这个讨论范围之内)。

    所谓“崩溃”,是当你的程序向操作系统发出读写内存的请求,操作系统发现你的程序企图往一个无效的地址上写数据,或者往被标记为只读的地方写数据,或者从一个没有读取权限的地方读取数据等等,操作系统会判断你的程序有问题,从而终止它的运行,引起程序的“崩溃”。

    所以,程序有对内存的非法访问,不一定引起崩溃,但是崩溃,肯定是访问了非法的地址(这里不涉及别的原因引起的异常)。

    结合到你的程序,你定义一个没有初始化的指针,其实没事,只是当你试图读写这个指针指向的内存才算非法访问,而非法访问的后果,是不可预料的,和你的程序、操做系统、环境、编译器都有关系。

    点赞 2 评论 复制链接分享
  • m_geek m_geek 4年前

    首先,咱们来看一下一和二的区别。

    点赞 2 评论 复制链接分享
  • jonah_king jonah_king 4年前

    1、首先我们看一下 Elem_ptr c 这个时候 C的值 应该是0。 即 C 这个变量的地址在 栈空间, C 的数据值 0

    c = (Elem_ptr)malloc(n*sizeof(char));

        这条语句的操作,c = (Elem_ptr)malloc(n*sizeof(char));  可以转化为 (char *)(0)  = xxxx;   
         是对_地址0 _ 进行 数据写入。即  所以访问权限出了问题,导致死机。
    

    2、Elem_ptr *c 定义的是指针的指针 即 C 这个变量的地址在 栈空间, C 的数据值 0

        c的地址为栈空间, c = (Elem_ptr)malloc(n*sizeof(char)); 可以转为化  (cha *)(栈空间) = xxxx;            
        是对 _栈地址 _进行数据写入,      即对栈空间的数据进行修改,所以允许修改。
    
        要想明白这个原因,需要了解 指针的用法,建议看一下  让你不再害怕指针
    
    点赞 1 评论 复制链接分享

相关推荐