C语言中的结构实现数组

时间:2014-10-13 07:17:53

标签: c arrays struct

我需要对我的struct实现数组有一些想法。这就是我的结构。我打算将SHAPES作为一个数组,因为我将拥有多个SHAPES。每个形状都有多个x和y坐标。因此,我不确定是否应该制作链表。开始和结束的目的是在我得到正确的形状后,我最终将运行搜索算法。

struct START
{
    int x; 
    int y;
};
struct END
{
    int x; 
    int y;
};
struct SHAPES
{
    int x [100]; 
    int y [100];
    int *link;
};
struct DISTANCE
{
    int distance_traveled; 
    int distance_to_finish;
};

我正在读这篇文章,并想知道我是否需要malloc或calloc我的结构,因为我创建它们。如果是,为什么,如果不是为什么? Malloc和calloc总是令我困惑。

How do you make an array of structs in C?

int main(int argc, char *argv[])
{

    //Is it better to make these pointers? 
    struct START start;
    struct END end;
    struct SHAPES shapes[100];

    while(fgets(line, 80, fp) != NULL)
    {
        //I have a very annoying issue here, I don't know the size of the lines. 
        //If there are more values I want to increment the x[] and y[] array but NOT the 
        //shapes array. I can only think of one way to deal with this by putting a bunch of 
        //variables in the sscanf. I discovered putting sscanf on the next line didn't do what 
        //I was hoping for. 
        sscanf(line, "%d%*c %d%*c ", &shapes[i].x[i] , &shapes[i].y[i] );
        printf(" line is: %s \n", line);
        sscanf(line, "%d%*c %d%*c ", &x1_main , &y1_main );
        printf(" line is: %s \n", line);
        printf(" shapes[i].x[i] is: %d \n", shapes[i].x[i]);
        printf(" shapes[i].y[i] is: %d \n", shapes[i].y[i]);
        printf(" x1_main is: %d \n", x1_main);
        printf(" y1_main is: %d \n", y1_main);
        i++;
        memset(line, 0, 80);
    }

}

这就是我的文件的样子。添加%*c似乎可以恰当地处理逗号和分号。

10, 4
22, 37
22, 8; 2, 0; 3, 6; 7, 8; 5, 10; 25, 2
1, 2

我从这里得到了这个想法。

https://www.daniweb.com/software-development/c/threads/334515/reading-comma-separated-values-with-fscanf

2 个答案:

答案 0 :(得分:1)

首先,你可能想要考虑这样的事情:

struct point {
      int x;
      int y;
};

因此您可以使用struct point数据结构(数组)代替xy的两个单独数据结构。像这样使用它也应该加快对点的访问,因为它们的坐标在内存中彼此相邻。否则,您将在x数组中的某处x和y数组中的某个地方y

用于存储积分的数据结构的选择取决于您的使用情况。如果您需要直接寻址点,链接列表可能是一个糟糕的选择。如果您始终以线性顺序访问所有点,则可以。但是,请考虑单个链接列表将为next指针每点添加8个字节。双向链表将为prev使用另外8个字节(假设64位拱是一般的sizeof(pointer))。我假设您创建x[100]y[100]以确保您有足够的空间。您可能最好使用dynamic array(ADT),例如毕竟是glib的GArray。它会在你不需要做任何事情的情况下随着你的需要增长。

对于malloc vs calloc:这并不重要。拨打calloc的呼叫基本上是malloc,后跟

memset(ptr, 0, sizeof(mallocd area);

即。记忆被归零; cf manpage calloc。如果直接初始化内存,则可能不需要这样做。

答案 1 :(得分:0)

没有指针成员的结构
如果你的struct没有指针成员,例如:

typedef struct {
    int a;
    int b;

} DEMO;  

然后你可以简单地声明一个typedef结构的数组实例,如下所示:

DEMO demo[10];// instance of array of 10 DEMO

示例,包含指针成员的结构
如果成员列表中有一个指针:

#define SIZE_STR 20

typedef struct {
    int a;
    int b;
    char *str;//pointer, will require memory allocation
} DEMO;

DEMO demo[10];// instance of array of 10 DEMO

int main(void)
{
    int i;

    for(i=0;i<10;i++)//create memory for each instance of char * in array of DEMO
    {   
        demo[i].str = malloc(SIZE_STR); 
    }
    return 0;
}  

不要忘记free()所有malloc内存实例。

动态分配struct 的数组 如果需要为结构动态分配内存:

typedef struct {
    int a;
    int b;
} DEMO;  
DEMO demo, *pDemo;// create a pointer to DEMO

在函数中,main()例如:

int main(void)
{
    pDemo = &demo;  
    pDemo = malloc(sizeof(DEMO)*10);//provides an array of 10 DEMO
    return 0;
}  

同样,不要忘记free()所有malloc内存实例。