为此,我从标准输入中给定的维度创建了一个指向数组,并为数组中的每个结构分配了内存。这有意义吗?我该如何解决这个问题?EDIT由于riga[x]是int,我如何将结构与数组连接起来?EDIT 2我需要创建一个结构数组,数组的维度在标准输入中给出。对不起,如果我不善言辞,我对这个还很陌生
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char c;
int ni;
double nr;
}dati;
int main () {
int a,b,K;
int *riga;
printf("a b Kn");
scanf ("%d %d %d",&a,&b,&K);
printf("%d %d %dn", a, b, K);
riga= (int*) malloc(sizeof(int)*K);
printf("insert %d valors",K);
for (int k=0;k<K;k++)
scanf("%d", &riga[k]);
for(int p=0;p <K;p++)
printf("%dn", riga[p]);
for (int x=0; x>K;x++)
riga[x]=malloc(sizeof(dati));
for (int i=0; i<K; i++){
printf("insert data in line %d", i+1);
scanf("%c %d %lf", riga[i].c, riga[i].ni, riga[i].nr);
}
for (int j=0; j<K;j++)
printf("%c %d %lfn", riga[j].c,riga[j].ni,riga[j].nr);
exit(EXIT_SUCCESS);
}
它在第28行给我一个警告;警告:从"void*"到"int"的赋值使指针中的整数不带强制转换[-Wint conversion]">
以及打印结构体的错误";错误:在非结构或并集中请求成员"c";
您的变量riga需要是dati的数组。您还需要检查对scanf的调用是否成功。要跳过前导空格,需要在格式字符串的%c
之前添加一个空格。为了让内存分配更容易,我总是使用宏函数。这里有一个解决方案:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NEW_ARRAY(pointer, length)
{
(pointer) = malloc(((size_t) length) * sizeof (pointer)[0]);
if ((pointer) == NULL) {
fprintf(stderr, "Allocating memory failed: %sn", strerror(errno));
exit(EXIT_FAILURE);
}
}
typedef struct {
char c;
int ni;
double nr;
} dati;
int main(void)
{
dati *riga;
int K, n;
printf("Number of lines: ");
n = scanf("%d", &K);
if ((n == 1) && (K > 0)) {
NEW_ARRAY(riga, K);
for (int i = 0; i < K; i++) {
printf("insert data in line %d: ", i + 1);
n = scanf(" %c %d %lf", &riga[i].c, &riga[i].ni, &riga[i].nr);
if (n != 3) {
fprintf(stderr, "Character, integer and real number expected at line %dn", i + 1);
exit(EXIT_FAILURE);
}
}
for (int i = 0; i < K; i++) {
printf("%c %d %lfn", riga[i].c, riga[i].ni, riga[i].nr);
}
free(riga);
} else {
fprintf(stderr, "Non-negative integer expectedn");
exit(EXIT_FAILURE);
}
return 0;
}
您已经定义了int *riga
。因此,您的前两个for
循环将存储数据。也就是说,riga
是指向int
的1D阵列的指针。
所以,您的前两个for
循环是可以的。
但是,在您的第三个for
循环中,您会执行以下操作:
riga[x] = malloc(sizeof(dati));
您取消引用riga
,因此这是int
,但您正在分配指针
riga
[再次]是指向int
数组的指针,而不是指向struct
数组的指针。因此,您可以而不是do(例如(:
riga[i].c
不清楚您有什么数据或希望如何存储。有两种解释:
- 您似乎想要输入两个独立的数组。首先,一个长度为
K
的int
的简单1D数组,您称之为riga
。并且,dati
结构的单独数组,长度也是K
- 您只需要一个长度为
K
的结构dati
的数组
我已经重构了代码[有一些猜测],以确定您需要什么。
我选择解释(1(是因为它最接近您的代码。当riga
引用您的dati
结构时,我将其重命名为datarray
。
如果您想要(2(,只需删除下面与riga
相关的代码。
我使用了cpp
条件词来表示新旧代码:
#if 0
// old code
#else
// new code
#endif
这是调整后的代码[带有一些注释]:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char c;
int ni;
double nr;
} dati;
int
main(void)
{
int a, b, K;
printf("a b Kn");
scanf("%d %d %d", &a, &b, &K);
printf("%d %d %dn", a, b, K);
// this is interpretation (1) -- you want two separate arrays
#ifndef ONLY_ONE_ARRAY
#if 0
int *riga = (int *) malloc(sizeof(int) * K);
#else
int *riga = malloc(sizeof(*riga) * K);
#endif
printf("insert %d valors", K);
for (int i = 0; i < K; i++)
scanf("%d", &riga[i]);
for (int i = 0; i < K; i++)
printf("%dn", riga[i]);
#endif
// NOTE/BUG: riga is an int pointer so this is invalid
#if 0
for (int x = 0; x > K; x++)
riga[x] = malloc(sizeof(dati));
#else
dati *datarray = malloc(sizeof(*datarray) * K);
#endif
for (int i = 0; i < K; i++) {
printf("insert data in line %d", i + 1);
#if 0
scanf("%c %d %lf", riga[i].c, riga[i].ni, riga[i].nr);
#else
scanf("%c %d %lf", datarray[i].c, datarray[i].ni, datarray[i].nr);
#endif
}
#if 0
for (int i = 0; i < K; i++)
printf("%c %d %lfn", riga[j].c, riga[j].ni, riga[j].nr);
#else
for (int i = 0; i < K; i++)
printf("%c %d %lfn", datarray[i].c, datarray[i].ni, datarray[i].nr);
#endif
return EXIT_SUCCESS;
}