[英]generic C - what happens when I call "struct *s"?
我正在参加 CS 107 斯坦福课程,在讲座中我们有这个简单的堆栈结构
// stack.h
typedef struct {
int *elems;
int logicallen;
int alloclen;
} stack;
他通过做提到
stack *s;
它应该自动为结构保留内存空间。
但是,我遇到了分段错误,我必须这样做手动分配内存:
stack *s = malloc(3*sizeof(int));
当我尝试打印 s 时,它显示 0
// this will cause segmentation fault
int main(){
stack *s;
printf("%d\n", s);
StackNew(s);
}
// this is fine
int main(){
stack *s = malloc(sizeof(stack));
printf("%d\n", s);
StackNew(s);
}
那么stack *s;
到底是什么? 做?
这条线
stack *s;
是stack *
类型的未初始化指针的函数 main 中的声明(定义)。 所以指针的值是不确定的。 没有创建stack
类型的对象。
要取消引用指针,它必须指向一个有效的对象。 否则,取消引用未初始化的指针会调用未定义的行为。
请注意,要输出指针,您必须使用转换说明符p
而不是d
printf("%p\n", ( void * )s);
他通过做提到
stack *s;
它应该自动为结构保留内存空间。
不,它不应该那样做。
那么
stack *s;
到底是什么? 做?
然而,它所做的是声明一个指向stack
的指针。 或者,换句话说,为指向stack
的指针保留内存空间。 该指针未初始化,这意味着它指向某个随机(*)内存位置。 并且尝试取消引用它会导致未定义的行为,这意味着任何事情都可能发生,包括您的代码看似有效。 这解释了你的说法:
当我尝试打印 s 时,它显示 0
在使用它们之前几乎总是将指针初始化为NULL
是一种很好的做法。 这样,您将避免孔类问题。
此外,不要忘记在不再需要分配的资源后释放它们。
(*)通常,它指向上次使用它所指向的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.