使用动态数组的Segfault

时间:2015-03-25 11:35:04

标签: c arrays dynamic malloc

为这个非常糟糕的问题道歉 - 我真的不确定如何说出来。 我正在执行一段代码,我正在尝试使用动态数组。它在这一行是分段的:

void myFunction(....) {
     // other code up here
     Stack *s = stack_new(); //segfault here
}

我的struct的相关头文件是:

typedef struct {
    void **A;   
    int size;   
    int top;    // the index of the current top of the stack
} Stack;

并且函数stack_new()是:

Stack 
*stack_new() {
    Stack *s; 
    s->size = 1; 
    s->top = -1; 
    s->A = (void **)malloc(s->size);
    return s;
}

我想我已经包含了所有相关内容,但如果您需要更多代码,请告诉我。

我认为问题在于我使用malloc的方式,但是已经在线搜索并尝试了一些不同的选项,我仍然得到了段错误。有人能提供一些见解吗?

谢谢你堆

3 个答案:

答案 0 :(得分:4)

这是你的问题:

Stack *s; 
s->size = 1;

您实际上并没有分配Stacks未初始化并指向内存中的任意位置。 s->size显然会失败。

尝试:

Stack *s = malloc(sizeof(*s));
if (s == NULL)
{
    fprintf(stderr, "Memory allocation error\n");
    exit(1);
}
s->size = 1;

注意:您还应该检查s->A是否为NULL。如果是这样,请返回错误代码(例如NULL)并在此之前记住释放您分配的Stack,或者打印错误消息并退出程序。如果退出程序,操作系统将回收所有使用的内存,因此无需明确地执行此操作。

另一个注意事项:做什么时

s->size = 1; 
s->top = -1; 
s->A = (void **)malloc(s->size);

...即使您应该分配sizeof(void*)个字节的内存,也要分配1个字节的内存。尝试做

s->A = (void **)malloc(s->size*sizeof(void*));

代替。

答案 1 :(得分:2)

这是你的第一个问题:

Stack *s; 
s->size = 1; 

您实际上期望s的价值在这一点上是什么?它可以是 任何 。如果结构本身尚未分配,则无法设置结构的字段。

尝试:

Stack *s = malloc(sizeof(*s));
if(!s){
     //... error checking / exiting ..
} 

然后你正在做的其他事情。

答案 2 :(得分:1)

您正在访问未初始化的指针!

Stack 
*stack_new() {
    Stack *s = std::nullptr;  // initialize this pointer with nullptr
                              // and then you will see later (one line
                              // beyond) that you will try to access a
                              // null pointer
    s->size = 1; // the problem occurs here!!
                 // you are accessing a pointer, for which has never
                 // been allocated any memory
    s->top = -1; 
    s->A = (void **)malloc(s->size);
    return s;
}

您必须使用“malloc”为此指针分配一些内存。 某事。在这两行之间缺少这样的内容,我评论道:

堆叠

*stack_new() {
  Stack *s = (Stack*)malloc(sizeof(Stack));
  s->size = 1;
  s->top = -1; 
  s->A = (void **)malloc(s->size);
  return s;
}
相关问题