【问题标题】:Segfault using dynamic array使用动态数组的段错误
【发布时间】:2015-03-25 11:35:03
【问题描述】:

为这个非常糟糕的问题道歉 - 我真的不知道如何措辞。 我正在执行一段代码,我正在尝试使用动态数组。在这一行是段错误:

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

我的结构的相关头文件是:

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 的方式上,但在网上进行了搜索并尝试了一些不同的选项,但仍然出现段错误。有人能提供一些见解吗?

谢谢大家

【问题讨论】:

  • 不要投你的malloc
  • 你在stack_new()中为s分配内存在哪里?
  • 还有一个链接为什么你不应该投malloc返回值:stackoverflow.com/questions/605845/…
  • @BlueMoon: s 是自动分配的。但是,*s 不是。

标签: c arrays dynamic malloc


【解决方案1】:

这是你的问题:

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*));

改为。

【讨论】:

  • 我不同意@RickyMutschlechner,它是sizeof(*s) 而不是sizeof(s)。这个答案对我来说很好。
  • @Maxime 刚刚检查过,我认为这是正确的(您/回答者所说的)
  • Stack *s 的意思本质上是*s 是一个Stack 遵循声明遵循使用原则。所以,这是正确的。 malloc(sizeof(s)) 将是 4 或 8 个字节,具体取决于 32 位/64 位架构,因为 sStack*
  • 请注意,这不是您程序中的唯一问题。即使您应该分配 sizeof(int) 字节的内存,您也分配了 1 个字节的内存。
  • 更正:你应该分配sizeof(void*),而不是sizeof(int)。我已经编辑了我的帖子来展示你应该如何分配内存。
【解决方案2】:

这是你的第一个问题:

Stack *s; 
s->size = 1; 

此时您实际期望s 的值是多少?它可以是字面上的任何东西。如果结构本身尚未分配,则不能设置结构的字段。

试试:

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

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

【讨论】:

  • 修正了答案中的一些错别字。
  • 谢谢!所以问题是我试图访问 s,而我实际上并没有为其分配内存,对吧?这是否意味着以后在使用 realloc 时,我也应该 realloc s(而不是 s->A)?
  • @KittiCat 是的!没错。
【解决方案3】:

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

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;
}

【讨论】:

  • 请删除所有的演员表...这是 C,不是 C++。
猜你喜欢
  • 2017-08-06
  • 1970-01-01
  • 2021-07-12
  • 2021-08-31
  • 2013-09-04
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多