zoukankan      html  css  js  c++  java
  • c语言指针segmentation fault 指针常常错误的小地方

    #include <stdio.h>

    #define JUDGE_POINT_TWO 1

    int main()
    {
    #if JUDGE_POINT_TWO
    char str[] = "qingjoin";
    char *ptr = "c program";
    char *point;

    point = str;
    point[2] = 'a';
    point[3] = 'x';
    printf("str=%s\n",str);

    ptr[13] = 'm'; //这个地方是错误的

    printf("ptr=%s\n",ptr);
    #endif
    }

    编译结果:
    # gcc test_point.c -o test_point
    # ./test_point
    str=qiaxjoin
    Segmentation fault

    //char str[] = "qingjoin"; str就数组变量,当地址赋给point后。point[2]就是str[2],它的内容是可以改变的

    //char *ptr = "c program"; 它是先定义一个常量,"c program" 这个常量是定义在“栈”里面,然后将这个常量的地址赋给ptr,而不是*ptr。常量是不能被修改的 所以ptr[13] = 'm'; 就会出错

    
    
    #include <stdio.h>

    #define JUDGE_ONE 1

    int main ()
    {
    #if JUDGE_ONE
    int i = 129;
    int num[] = {20,30,40,50};

    int *p;
    p = &i;

    /**************************************************
    这样是正确的, 或int *p = &i 但 int *p=i这样的话就是错误的
    如果是 *p = i 这样编译时是不会出现错误,但程序运行的时候会出现段错误
    原因是没有给 p 分配内存它没有空间去存放i 的值
    *************************************************
    */

    char *str;
    *str = "qingjoin"; // 这种写法是错误的。因为"qingjoin"是字符串,也是数组,在这里它是常量
    str = "qingjoin" ; // 这种才是正确的 ,赋值的时候赋的是地址,它只能赋给指针变量str;
    printf("%d\n",*p);
    #endif
    }

         int w[5];
    int *pw=w ; // pw表示数组w ,或者说指向变量w[0]
    int *q=&w[2]; // q指向变量w[2]
    int rr[10][5],(*pr)[5]; /* pr是指向一维数组的指针,该一维数组 有5个元素,每个元素是一个整数 */
    pr=rr; // pr指向一维数组rr[0],该rr[0]有5个元素
    int *qr[5]; /* qr是指针数组,有5个元素,每个元素是一个指向 int类型变量的指针 */
    int *(tr[5]); /* 同qr 。tr是指针数组,有5个元素,每个元素是 一个指向int类型变量的指针 */
    qr[1]=&y; // qr[1]指向变量 y


    
    
  • 相关阅读:
    LR(0)分析法
    算符优先法之优先表构造
    自上而下的LL(1)语法分析法
    K倍区间
    全排列
    mysql自动获取时间日期
    限制
    JQuery
    LinQ 组合查询与分页
    LinQ 简单使用
  • 原文地址:https://www.cnblogs.com/qingjoin/p/2408944.html
Copyright © 2011-2022 走看看