2016-06-27 110 views
1

我很困惑如何创建一个结构数组。这里是我的代码:如何创建一个结构数组

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

typedef struct line 
{ 
    int x; 
} *line; 

int main() 
{ 
    line *array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 

     array[i]->x = 5; 
    } 

    for(i; i < 2; i++) 
    { 
     printf("%d\n", array[i]->x); 
    } 

    return 0; 
} 

我的困惑来自于以下几个:从我的理解,如果你有一个typedef,并给它一个名称的指针如*线,那么你可以访问和使用的结构变异的每个项目 - >符号。我似乎没有把握好,不知道为什么。

我的错误:

分割故障(核心转储)

回答

5

typedefline作为一个指针结构,而不是结构本身。所以当你基于sizeof linemalloc -ed,你有10个指针的空间,而不是10个结构的副本。在typedef之前删除line之前的*,以便获得一个结构数组,而不是指向struct的(未分配的)指针数组。索引指针后,您将使用正常的点访问。

如果你真的想要一个指向struct的指针数组,你需要分别分配每个结构,这可能不是你想要的。

0

你几乎拥有它,你只需要调整或者您的语法或每一结构分配更多的内存:

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

typedef struct line 
{ 
    int x; 
} *line; 

int main() 
{ 
    line *array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 
     // XXX HERE YOU ALLOCATE MORE MEMORY 
     array[i] = malloc(sizeof array[i]); 
     array[i]->x = 5; 
    } 
    // XXX RESET "i" TO ZERO 
    for(i=0; i < 2; i++) 
    { 
     printf("%d\n", array[i]->x); 
    } 

    return 0; 
} 

你也永远不会再使用它之前重置i数组索引变量。

1

这里,固定它为雅:

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

typedef struct line 
{ 
    int x; 
} Line; 

int main() 
{ 
    Line* array = malloc(10 * sizeof(line)); 

    int i = 0; 

    for(i; i < 2; i++) 
    { 

     array[i].x = 5; 
    } 

    for(i; i < 2; i++) 
    { 
     printf("%d\n", array[i].x); 
    } 

    return 0; 
} 
+0

这将是没有第一句口语一个更好的答案,并与你改变什么解释,为什么它很重要。 'for(i; i <2; i ++)'表示法虽然是从问题中复制过来的,但它并不好,尤其是对于第二个循环,因为它访问未初始化的数据而引发未定义的行为。如果你不打算在初始化部分做任何事情,把它留空,但总是使用'for(i = 0; i <2; i ++)'或甚至(C99或更新)'for int i = 0; i <2; i ++)'并在循环之外放置'i'的定义。 –

+1

@JonathanLeffler是索引变量'我'同样的原因对我的答案downvote以及?除了提及或者可能给出更详细的答案之外,我没有看到任何问题。 – tijko

+0

不是我的投票。不过,我的意见是站得住的 –