C语言中结构数组的动态变化
我一直在努力用C语言创建一个动态变化的结构数组。我的数组大小应该根据用户决定写入数据的次数(city1 city2和距离)而变化。我说的是加法函数,它应该在用户每次输入数据时生成一个更大的数组;它还应该在这个数组中存储结构。我使用了realloc函数,但它似乎不起作用。 在我的主函数中,我要求用户写两次数据,并在每次输入后启动我的函数。出于某种原因,它在第一次函数初始化后工作,但在第二次初始化后崩溃。我的意图是它在一个循环中工作(用户添加他想要的数据)。 代码如下:C语言中结构数组的动态变化,c,arrays,C,Arrays,我一直在努力用C语言创建一个动态变化的结构数组。我的数组大小应该根据用户决定写入数据的次数(city1 city2和距离)而变化。我说的是加法函数,它应该在用户每次输入数据时生成一个更大的数组;它还应该在这个数组中存储结构。我使用了realloc函数,但它似乎不起作用。 在我的主函数中,我要求用户写两次数据,并在每次输入后启动我的函数。出于某种原因,它在第一次函数初始化后工作,但在第二次初始化后崩溃。我的意图是它在一个循环中工作(用户添加他想要的数据)。 代码如下: #include &
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct edge{
char city1[30];
char city2[30];
int distance;
}edge;
void addEdge(edge **tab, char* city1, char* city2, int distance, int* n);
int main()
{
edge *tab;
tab=(edge*)malloc(0);
char city1[30], city2[30];
int distance, n=1;
printf("\nType cities and distance in form: 'city1 city2 distance'\n");
scanf("%s %s %d", city1, city2, &distance);
addEdge(&tab, city1, city2, distance, &n);
printf("\nType cities and distance in form: 'city1 city2 distance'\n");
scanf("%s %s %d", city1, city2, &distance);
addEdge(&tab, city1, city2, distance, &n);
system("pause");
return 0;
}
void addEdge(edge **tab, char* city1, char* city2, int distance, int* n)
{
edge edgeN;
strcpy(edgeN.city1, city1);
strcpy(edgeN.city2, city2);
edgeN.distance=distance;
*tab=(edge*)realloc(*tab, *n * sizeof(edge));
*tab[*n-1]=edgeN;
*n=*n+1;
}
#包括
#包括
#包括
typedef结构边缘{
char city1[30];
char city2[30];
整数距离;
}边缘;
void addEdge(边**选项卡,字符*city1,字符*city2,整数距离,整数*n);
int main()
{
边缘*选项卡;
tab=(边*)malloc(0);
char city1[30],city2[30];
整数距离,n=1;
printf(“\n在表单中键入城市和距离:'city1 city2 distance'\n”);
scanf(“%s%s%d”、城市1、城市2和距离);
附录(&tab,城市1,城市2,距离,&n);
printf(“\n在表单中键入城市和距离:'city1 city2 distance'\n”);
scanf(“%s%s%d”、城市1、城市2和距离);
附录(&tab,城市1,城市2,距离,&n);
系统(“暂停”);
返回0;
}
void addEdge(边**选项卡,字符*city1,字符*city2,整数距离,整数*n)
{
边缘边缘;
strcpy(edgeN.city1,city1);
strcpy(edgeN.city2,city2);
边缘距离=距离;
*tab=(边缘*)realloc(*tab,*n*sizeof(边缘));
*表[*n-1]=边缘;
*n=*n+1;
}
您的错误之一是从未检查函数调用的任何可能故障scanf()
返回有效字段数或错误,malloc()
或realloc()
可以返回错误
edge *tab = NULL;
size_t n = 1; // should be size_t and not int
// ...
if (scanf("%29s %29s %d", city1, city2, &distance) != 3) {
fprintf(stderr, "wrong input\n");
exit(EXIT_FAILURE);
}
// ...
edge *tmp = realloc(*tab, *n * sizeof *edge);
if (!tmp) {
exit(EXIT_FAILURE);
}
*tab = tmp;
您落入了运算符优先级陷阱<代码>*制表符[*n-1]=edgeN代码>编译为
*(tab[*n-1])
,而您需要的是(*tab)[*n-1]代码>
当有疑问时,使用paren,它们可能是无用的,但它是无害的
这是问题的真正原因,但您也应该遵循Stargateur的建议,并测试所有输入和分配函数的返回值。您到底希望malloc(0)
做什么?实际上什么都没有,在我这么做之后,有些东西开始工作了…//编辑:在我删除它之后,它在函数首次初始化后崩溃。。。所以就像。。。在某些方面很重要:*n=*n+1@rgornicka@klutt实际上,malloc(0)
在某种程度上是重要的,因为realloc()
需要获取先前由malloc()返回的指针。从realloc
的手册页:*除非ptr为NULL,否则它一定是通过先前调用malloc()、calloc()或realloc()*返回的,可能存在很多问题。首先,你从不检查scanf()
的返回值,因此你不知道你的city1
和city2
数组中是否有垃圾。我否决了你,因为尽管你说的是一个好建议,但它并没有解决问题,所以这可能会误导他人。@KyrSt我想你误解了stackoverflow中回答的目的;)但我会更新我的答案,我确实没有看到这个问题的众多问题中的一个。事实上,帮助中心从未提到答案必须准确指向问题,而不是给出其他建议。我收回了我的投票,但我仍然相信,答案的形式会让其他有同样问题的人感到困惑,因为你的答案本身并不能解决OP的错误。OP的代码有很多缺点。有些人比其他人更挑剔。这回答了其中的4个问题。