Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中结构数组的动态变化_C_Arrays - Fatal编程技术网

C语言中结构数组的动态变化

C语言中结构数组的动态变化,c,arrays,C,Arrays,我一直在努力用C语言创建一个动态变化的结构数组。我的数组大小应该根据用户决定写入数据的次数(city1 city2和距离)而变化。我说的是加法函数,它应该在用户每次输入数据时生成一个更大的数组;它还应该在这个数组中存储结构。我使用了realloc函数,但它似乎不起作用。 在我的主函数中,我要求用户写两次数据,并在每次输入后启动我的函数。出于某种原因,它在第一次函数初始化后工作,但在第二次初始化后崩溃。我的意图是它在一个循环中工作(用户添加他想要的数据)。 代码如下: #include &

我一直在努力用C语言创建一个动态变化的结构数组。我的数组大小应该根据用户决定写入数据的次数(city1 city2和距离)而变化。我说的是加法函数,它应该在用户每次输入数据时生成一个更大的数组;它还应该在这个数组中存储结构。我使用了realloc函数,但它似乎不起作用。 在我的主函数中,我要求用户写两次数据,并在每次输入后启动我的函数。出于某种原因,它在第一次函数初始化后工作,但在第二次初始化后崩溃。我的意图是它在一个循环中工作(用户添加他想要的数据)。 代码如下:

    #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个问题。