你的C/C++程序为什么无法运行?揭秘Segmentation fault

这是别人的优秀博文:
你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)
你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
你的java/c/c++程序崩溃了?揭秘段错误(Segmentation fault)


void func1(char ** dest,char * src,int n) {
    (*dest) = (char*)malloc(sizeof(char)*n);
    strcpy(*dest,src);

}

错误代码

char ** p = NULL;
func1(p,str,len);

正确代码

char * p = NULL;
func1(&p,str,len);

你的C/C++程序为什么无法运行?揭秘Segmentation fault_第1张图片
看一个例子:

    int a = 5;
    int *p = NULL;
    int *q = NULL;
    p = &a;
    *(&q) = &a;
    printf("%s\n","指向内容");//指向一个地址值,区分指针自身地址值
    printf("%d\n",*p);
    printf("%d\n\n",*q);

    printf("%s\n","指向地址");//指针变量的值,类比a=5,变量a的值是5
    printf("%d\n\n",&a);
    printf("%d\n",p);
    printf("%d\n",q);

    printf("%s\n","自身地址");//类比变量a的自身地址
    printf("%d\n",&p);
    printf("%d\n",&q);

    ************************

    指向内容
    5
    5

    指向地址
    6422316
    6422316
    6422316

    自身地址
    6422312
    6422308

  指针的简单用法
  指针指向的含义是什么:白话来讲,就是指针自身地址值下存放另一个地址(叫:指向地址)。不管初始化也好,赋值也好,都是将一个地址值给了一个指针变量。
  (1)初始化

        int a = 5;
        int *p = &a;
        //初始化,说白了就是先声明后赋值的简写形式。
        //等价于:
        //int *p;
        //p = &a;

  (2)赋值

        int a = 5;
        int *p = NULL;
        int *q = NULL;

        p = &a;//其实就是下一行代码的简写形式
        *(&q) = &a;//自身地址下存放一个指向地址 

        printf("%d\n",*p);
        printf("%d\n",*q);
        *************************
        5
        5

  (3)取值运算符 &
  (4)取内容运算符 *
  
  错误原因:凡是遇到指针,我们要时刻明确指针的指向地址和指针的自身地址。显然在错误代码中,我们将,指针的指向地址当做参数传入右侧函数 func1(p,str,len) 中,要知道此时指针p的指向地址可是0x0,也就是空,这是个保留地址,访问这个地址是会报错的。必然在遇到后面的代码(*dest) = (char*)malloc(sizeof(char)*n);会出错。而func1(&p,str,len);传入的是指针的自身地址,在遇到后续代码(*dest) = (char*)malloc(sizeof(char)*n);时候,* &p=(char*)malloc(sizeof(char)*n)为指针进行赋值操作。

你可能感兴趣的:(c语言)