关于指针初始化为NULL的一些问题
-
关于指针初始化问题,先看以下代码;
#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,这是一个很经典的错误,这是关于这个异常的一篇文章
这是因为我初始化指针,但是后续没有对这个指针再次进行操作。对于指针初始化,可以参考这个文章
这里提到了:但是在操作系统中,该内存单元是不可用的。凡是试图往该内存单元中写入数据的操作都会被视为非法操作,从而导致程序错误。同样,这种错误在编译的时候也不会报错,只有在执行的时候才会出错。这种错误也属于“段错误”。
然而虽然这么写是错误的,但是将一个指针变量初始化为指向 NULL,这在实际编程中是经常使用的。就跟前面讲普通变量在定义时给它初始化为 0 一样,指针变量如果在定义时不知道指向哪里就将其初始化为指向 NULL。只是此时要注意的是,在该指针变量指向有效地址之前不要往该地址中写入数据。也就是说,该指针变量还要二次赋值。而我的程序下的
Stack s = {"", 0};stack = &s;正是对该指针变量的二次赋值。
(因为没搞懂这个,还被我舍友臭骂了一顿)。ok以上就是关于指针初始化为NULL,我的看法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了