我需要对我的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
我从这里得到了这个想法。
答案 0 :(得分:1)
首先,你可能想要考虑这样的事情:
struct point {
int x;
int y;
};
因此您可以使用struct point
数据结构(数组)代替x
和y
的两个单独数据结构。像这样使用它也应该加快对点的访问,因为它们的坐标在内存中彼此相邻。否则,您将在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内存实例。