在声明结构时,我在c中遇到了分段错误



很抱歉问了这么多问题当我声明一个结构并将其大小设置为80时,它会导致分段错误。我尝试了一些资源,但无法理解这个错误,这个错误也没有给我更多的细节。。。。这是我的代码-

#include <stdio.h>
#include <stdlib.h>
struct stack
{
int size;
int top;
int *arr;
};
int isEmpty(struct stack *ptr)
{
if (ptr->top == -1)
{
return 1;
}
else
{
return 0;
}
}
int isfull(struct stack *ptr)
{
if (ptr->top == (ptr->size - 1))
{
return 1;
}
return 0;
}
int main()
{
printf("Testn");
struct stack *s;
s->size = 80; //segmentation error occurs here
printf("Testn");
s->top = -1;
s->arr = (int *)malloc(s->size * sizeof(int));
// printf("Testn");
printf("%d",isEmpty(s));
if (isEmpty(s))
{
printf("stack is empty");
}
else
{
printf("Not empty");
}
return 0;
}

当我声明结构体的大小为80时,它给出了分段错误,我不知道为什么

提前感谢

您声明的是指向结构的指针,而不是结构。

为了修复分段故障,将内存分配给指针指向的结构:

struct stack *s;
s = malloc(sizeof(struct stack)); // Check for errors before using it.
s->size = 80; // No more segfault

别忘了稍后释放((。在使用指针之前,还要检查malloc错误。

struct stack *s;
s->size = 80;

s是指向结构的指针,它不是结构。此外,s是未初始化的指针。这意味着它的价值并不是完全已知、确定或定义的。尝试访问指针会调用未定义的行为。

要解决您的问题,您必须分配一些指针将指向的内存:

struct stack *s = malloc(sizeof(*s));
if (s == NULL) {
// malloc() failed
}   

还记得一旦你完成了指针free()

struct stack *s = malloc(sizeof(*s));
if (s == NULL) {
// malloc() failed
}   
...
free(s);

注:

  • 不必强制转换malloc()的返回值

很抱歉出现这样一个noob问题当我声明一个结构并将其大小设置为80时,它给出了分段错误。

但您不是声明struct。这

struct stack *s;

。。。声明一个指针(可以指向struct stack(。它不会创建要指向的结构,甚至不会为s分配初始(指针(值。

当程序尝试。。。

s->size = 80;

。。。它正试图访问不存在的对象(*s(。由此产生的行为是未定义的,在实践中,segfault是此类代码的常见结果。

其他答案建议为s分配要指向的内存,这是可行的,但在这种情况下,最好声明一个实际的结构,而不是指向一个结构的指针:

struct stack s;  // not a pointer

也许您选择指针是因为您看到或知道需要将指针传递给堆栈操作函数(如isEmpty()isFull()(,但这并不意味着您需要声明或使用指针变量(这确实是一个noob错误(。通常,您想要的是自动或静态分配,并使用(&(运算符的地址。动态分配应在需要的地方使用,,但应避免在不需要的地方使用。如果这里不使用动态分配,那么就不需要指针变量。

因此,从上面的声明继续:

// use the direct member-access operator (.), not the indirect one (->)
s.size = 80;
s.top = -1;
// do not cast the return value of malloc() in C:
s.arr = malloc(s.size * sizeof(int));
// pass the address of s to isEmpty():
if (isEmpty(&s)) {
printf("stack is empty");
} else {
printf("Not empty");
}
return 0;

在这种情况下,不需要动态分配的重要原因之一是struct stack不需要超过函数执行的结束时间。如果你确实需要它比它被分配的功能更长寿,那么动态分配是实现这一点的必要条件。

相关内容

  • 没有找到相关文章

最新更新