2014-09-23 52 views
0

我一直在尝试为结构动态分配内存。我不断收到seg故障,我不知道为什么。我将代码缩减为练习程序,试图弄清楚什么是错的。此代码没有任何错误正确编译:Malloc 2d数组始终为空

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    int id; 
    }person; 

person **new; 

int main() 
{ 
    int x, size; 
    printf("How big is this? "); 
    scanf("%d", &size); 
    getchar(); 
    if((person **)malloc(size*sizeof(person))==NULL); 
    { 
    printf("There was a problem\n"); 
    exit(1); 
    } 
    person **new=(person **)malloc(size*sizeof(person **)); 
    for(x=0; x<size ;x++) 
     { 
     new[x]=(person *)malloc(sizeof(person *)); 
     new[x]->id=x*5; 
     } 
    for(x=0; x<size; x++) 
     { 
     printf("%d\t", new[x]->id); 
     free(new[x]); 
     } 
    free(new); 
    return 0; 
    } 

但每当我尝试运行它始终触发if语句来检查一个NULL并退出该程序。每当我拿出if语句,它就会完美运行并给出正确的答案。所以我不确定发生了什么问题。

+6

删除';'a如果('(** **)malloc(size * sizeof(person))== NULL);' – 2014-09-23 17:31:13

+0

此外,检查'scanf'是否成功,'size'可能是未指定的。 0)。第一个'malloc'调用是内存泄漏(因为每个'malloc'调用的结果都没有分配给任何东西)。检查'new'不是'NULL'。编译器警告可能会帮助我们处理错字。 – mafso 2014-09-23 17:37:00

+1

另外,不要在不存储返回值的情况下使用'malloc',您将无法访问分配的内存。相反,在'malloc'之后检查'new == NULL'。 (在我看来,这也会使整数语法更加整齐。) – 2014-09-23 17:38:30

回答

2

行之后有两个问题:

if((person **)malloc(size*sizeof(person))==NULL); 

Issue1:内存在的if状态的终点泄漏

Issue2:;

要解决这些问题,使用方法:

person **new=(person **)malloc(size*sizeof(person *)); 
if(NULL == new) 
{ 
    printf("There was a problem\n"); 
    exit(1); 
} 

另外,作为由弗朗西斯提到你需要改变你的new[x]的malloc声明:

new[x]=(person *)malloc(sizeof(person *)); 

要:

new[x]=(person *)malloc(sizeof(person)); 
+2

你想'sizeof(person *)',即'sizeof(* new)',不是吗? – 2014-09-23 17:40:41

+1

@欧姆是对的。 new [x] =(person *)malloc(sizeof(person *));'也是如此。它应该是'new [x] =(person *)malloc(sizeof(person));'错误的大小可能会触发分段错误。 – francis 2014-09-23 17:43:02

+0

对,相应编辑..谢谢.. – 2014-09-23 17:43:22