我遇到的第一个“段错误”

本文探讨了在C语言编程中遇到的段错误问题,特别是当尝试访问未初始化的指针时发生的错误。通过具体实例分析了错误产生的原因,并给出了正确的指针初始化方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在解决数据结构p48的数值转换问题上,遇到了第一个“段错误”。程序名为“Stack_test02”。错误的过程为:定义一个指针变量后,并未对指针赋值(并没有创建指针所指的对象),就直接试图通过指针对stack对象进行访问,结果产生错误。

typedef int stype;
typedef struct {
	stype *base;
	stype *top;
	int Stack_size;
} stack,*point;

void Init_stack (point p0)
{
	p0->base=(stype*)malloc(sizeof (stype)*maxsize);
	p0->Stack_size=maxsize;
	p0->top=p0->base;
}
void conversion (int a0,int cov)
{
	stack p0;//错误发生地点
	int e;
	Init_stack (&p0);
	while (a0>0){
		Push_stack (&p0,a0%cov);
		a0=a0/cov;
	}
	while (!Is_Empty(p0)){
		Pop_stack (&p0,&e);
		printf("%d",e);
	}
	
}

如果在错误地点写成point p0,则会发生段错误,因为定义一个指针后并没有对指针赋值(即指向的内容还未被创建),因此在Init_stack函数中通过指针访问对象会导致失败。

以前没失败是因为在定义p0时我总会顺手写成以下形式:

point p0=(point)malloc(sizeof(stack));

点击打开链接(对错误的直观解释)

点击打开链接(常见内存错误种类)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值