关于指针初始化为NULL的一些问题
Published on 2022-09-16 17:44 in 分类: 各种异常 with HFUUwzy
分类: 各种异常

关于指针初始化为NULL的一些问题

    1. 关于指针初始化问题,先看以下代码;

      #include <stdio.h>

      typedef struct
      {
        char data[128];
        int top;

      } Stack;

      void push(Stack *stack, char c)
      {
        stack->data[++stack->top] = c;
      }
      char pop(Stack *stack)
      {
        return stack->data[stack->top--];
      }
      int main()
      {
        Stack *stack = NULL;
        Stack s = {"", 0};
        stack = &s;
        push(stack, 'a');
        push(stack, 'b');
        push(stack, 'c');
        push(stack, 'd');
        push(stack, 'e');

        while (stack->top > -1)
            printf("%c", pop(stack));
      }

      这是一个普通的栈程序,在main函数中,首先对stack指针初始化为NULL;

      但是如果这就是所谓的初始化,看下图

       

       

    就会出现以上的错误,Segmentation fault,这是一个很经典的错误,这是关于这个异常的一篇文章(19条消息) Segmentation fault(Core Dump)问题_有石为玉的博客-CSDN博客

    这是因为我初始化指针,但是后续没有对这个指针再次进行操作。对于指针初始化,可以参考这个文章指针变量的初始化,C语言指针变量初始化详解 (biancheng.net)

    这里提到了:但是在操作系统中,该内存单元是不可用的。凡是试图往该内存单元中写入数据的操作都会被视为非法操作,从而导致程序错误。同样,这种错误在编译的时候也不会报错,只有在执行的时候才会出错。这种错误也属于“段错误”。

    然而虽然这么写是错误的,但是将一个指针变量初始化为指向 NULL,这在实际编程中是经常使用的。就跟前面讲普通变量在定义时给它初始化为 0 一样,指针变量如果在定义时不知道指向哪里就将其初始化为指向 NULL。只是此时要注意的是,在该指针变量指向有效地址之前不要往该地址中写入数据。也就是说,该指针变量还要二次赋值。而我的程序下的

    Stack s = {"", 0};stack = &s;正是对该指针变量的二次赋值。

    (因为没搞懂这个,还被我舍友臭骂了一顿)。ok以上就是关于指针初始化为NULL,我的看法。

    posted @   HFUUwzy  阅读(403)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · Manus爆火,是硬核还是营销?
    · 终于写完轮子一部分:tcp代理 了,记录一下
    · 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
    · 单元测试从入门到精通
    · 震惊!C++程序真的从main开始吗?99%的程序员都答错了
    点击右上角即可分享
    微信分享提示