我试图在C中学习结构,指针和动态数组。我不明白如何使用指针创建动态结构数组。我的代码不起作用,我不知道它有什么问题。我见过几个动态数组的例子,但是没有结构。任何帮助,将不胜感激。请给出一些解释,而不仅仅是代码片段,因为我想要理解的不仅仅是解决这个问题。
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
struct *struct_array;
int i,m,n,p;
struct data
{
char inputA[20];
char inputB[20];
};
struct data get_data()
{
struct data thisdata;
printf("Please enter input A\n");
scanf("%s", thisdata.inputA);
printf("Please enter input B\n");
scanf("%s", thisdata.inputB);
return thisdata;
}
void Output(struct data struct_array, int n)
{
int index = 0;
for(i = 0; i<n ;i++)
{
printf("%s ", struct_array[i].inputA);
printf("%s ", struct_array[i].inputB);
}
}
void resizeArray(int n)
{
struct_array = (int*)realloc(n*sizeof(int));
}
void mainMenu()
{
printf("Please select from the following options:\n");
printf("1: Add new students to database\n");
printf("2: Display current student database contents\n");
printf("3: exit the program\n");
scanf("%d", &p);
if(p == 1)
{
printf("Please enter the number of students to register:\n");
scanf("%d", &n);
resizeArray(n);
for(i = n; i<n ;i++)
{
struct_array[i] = get_data();
}
}
else if(p == 2)
{
Output(struct_array, n);
}
else
{
free(struct_array);
exit(0);
}
}
int main()
{
struct_array = (int*)realloc(2*sizeof(int));
mainMenu();
}
答案 0 :(得分:5)
您的源代码中有几个错误:
struct *struct_array;
(l.5)
这是什么意思?你想写struct data *struct_array
吗?
printf("%s ", struct_array[i].inputA);
(l.32&amp; l.33)
参数struct_array
掩盖了全局声明,它不是数组。你为什么要加上这个论点?
struct_array = (int *)realloc(n * sizeof(int));
(l.39)
你忘记了一个论点。您想要使用malloc
吗?此外,演员不是必要的(而且不正确!)。
除非您使用的是托管环境和C99 / C11,否则您应该从main
返回一个值。
您的变量index
未使用。你为什么宣布它?
for(i = n; i < n; i++)
(l.53)
你不会在这里进行任何迭代......
以下代码按预期工作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* TODO: Avoid global variables. */
struct data *struct_array;
struct data {
char inputA[20];
char inputB[20];
};
/*
* TODO: Try to avoid passing your structure (40 bytes + padding)
* without pointer.
*/
struct data get_data(void)
{
struct data thisdata;
printf("Please enter input A\n");
/* TODO: Avoid using `scanf` for human inputs. */
scanf("%s", thisdata.inputA);
printf("Please enter input B\n");
scanf("%s", thisdata.inputB);
return thisdata;
}
void Output(size_t n)
{
size_t i;
for (i = 0; i < n; i++) {
printf("%s ", struct_array[i].inputA);
printf("%s ", struct_array[i].inputB);
}
}
void resizeArray(size_t n)
{
/* TODO: Handle reallocations errors. */
struct_array = realloc(struct_array, n * sizeof *struct_array);
}
void mainMenu(void)
{
size_t i, n;
int p;
/* TODO: Use a loop ? */
printf("Please select from the following options:\n");
printf("1: Add new students to database\n");
printf("2: Display current student database contents\n");
printf("3: exit the program\n");
scanf("%d", &p);
switch (p) {
case 1:
printf("Please enter the number of students to register:\n");
scanf("%u", &n);
resizeArray(n);
for (i = 0; i < n; i++)
struct_array[i] = get_data();
break;
case 2:
Output(n);
break;
}
}
int main(void)
{
struct_array = malloc(2 * sizeof(int));
mainMenu();
free(struct_array);
return 0;
}
答案 1 :(得分:4)
您的定义
struct *struct_array;
是错误的。您必须使用类型名称data
。
struct data *struct_array;
这样你可以分配数组
struct_array = malloc(MaxNumElements * sizeof(struct data));
以后你应该释放内存
free(struct_array);
编辑:类型定义必须在var声明之前发生。
struct data ....
struct data* your_variable;
P.S。如果您每次使用struct
类型时都不想键入data
关键字,请使用typedef
:
typedef struct data_s
{
char inputA[20];
char inputB[20];
} data;
答案 2 :(得分:2)
你知道如何使用typedef吗?
我会建议它,让你的代码更容易理解,你不必键入struct一千次。您也可以将新类型视为与原始类型(整数,字符等)类似,只是不要忘记使用点(。)来访问您可能想要的各个字段。
您可以输入例如:
typedef struct{
char inputA[20];
char inputB[20];
} data;
现在你可以声明这样的变量:
data data_variable;
data *pointer_to_data;
你可以按如下方式分配内存:
pointer_to_data = (data*) malloc(sizeof(data)* N);
其中N是您要分配的struct数据量。同样适用于realloc。
答案 3 :(得分:0)
struct_array =(int *)realloc(2 * sizeof(int));
通过上面的语句,您试图将int的地址分配给类型为struct data
的指针。
您需要使用:
struct_array = (struct data*)realloc(2*sizeof(struct data));