繁体   English   中英

通用 C - 当我调用“struct *s”时会发生什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM