2015-03-25 49 views
-1

道歉的真正糟糕的问题 - 我真的不知道该怎么说。 我正在执行一段代码,我试图使用动态数组。这是段错误 - 荷兰国际集团在这一行:Segfault使用动态数组

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的方式,但在线搜索并尝试了几个不同的选项,仍然收到段错误。有人能够提供一些见解吗?

谢谢你满口

+2

勿投'malloc'。 – 2015-03-25 11:37:47

+2

你在'stack_new()'中为's'分配了什么内存? – 2015-03-25 11:38:13

+2

和一个为什么你不应该''malloc'返回值的链接:http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – juhist 2015-03-25 11:39:05

回答

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->ANULL。如果是,请返回错误代码(例如NULL),然后记住要释放您分配的Stack,或者输出错误消息并退出程序。如果退出该程序,操作系统将回收所有使用的内存,因此不需要明确地执行此操作。

另注:做

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

时......你分配的内存1个字节,即使你应该分配sizeof(void*)字节的内存。试试做

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

改为。

+0

我不同意@RickyMutschlechner,它的sizeof(* s)'不是'sizeof(s)''。这个答案对我来说很好。 – 2015-03-25 11:42:48

+0

@Maxime刚刚检查过,我认为这是正确的(你/回答者说的) – 2015-03-25 11:43:57

+1

什么'Stack * s'的意思本质上就是'* s'是一个'Stack',遵循声明遵循使用原则。所以,这是正确的。 'malloc(sizeof(s))'将会是4或者8个字节,这取决于32位/ 64位的arch,因为's'是一个'Stack *' – juhist 2015-03-25 11:44:44

2

这是你的第一个问题:

Stack *s; 
s->size = 1; 

你有什么实际期望的s值是在这一点?它可以从字面上任何东西。如果结构本身尚未分配,则不能设置结构的字段。

尝试:

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

,然后一切你在干什么。

+0

修复了答案中的一些错别字。 – 2015-03-25 11:39:37

+0

谢谢!所以问题是我试图访问s,当我没有真正分配它的内存时,对吧?这是否意味着在以后使用realloc时,我也应该重新分配s(而不是s-> A)? – KittiCat 2015-03-25 11:49:09

+0

@KittiCat是的!究竟。 – 2015-03-25 12:51:35

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

'std :: nullptr'在C? – halex 2015-03-25 11:46:15

+0

请删除所有的演员...这是C,而不是C++。 – 2015-03-25 11:46:33