为什么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);

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

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

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

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

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

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

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;            
    是对 _栈地址 _进行数据写入,      即对栈空间的数据进行修改,所以允许修改。

    要想明白这个原因,需要了解 指针的用法,建议看一下  让你不再害怕指针