我必须在 C 中创建一个带有指向数组的结构数组
i have to create an array of structs with a pointed array in C
为此,我根据标准输入给定的维度创建了一个指向数组,我为数组中的每个结构分配了内存。
这有什么意义吗?我该如何解决这个问题?
编辑,因为 riga[x] 是一个整数,我如何将结构与数组连接起来?编辑 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 K\n");
scanf ("%d %d %d",&a,&b,&K);
printf("%d %d %d\n", 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("%d\n", 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 %lf\n", riga[j].c,riga[j].ni,riga[j].nr);
exit(EXIT_SUCCESS);
}
它在第 28 行中给了我一个警告“警告:从‘void *’赋值给‘int’使得没有强制转换的指针成为整数 [-Wint-conversion]
“
以及打印结构“错误:请求成员‘c’不是结构或联合的错误”
您的变量 riga 需要是 dati 的数组。您还需要检查对 scanf 的调用是否成功。要跳过前导白色 space,您需要在格式字符串中的 %c
之前添加 space。为了使内存分配更容易,我总是为此使用宏函数。这是一个解决方案:
#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: %s\n", 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 %d\n", i + 1);
exit(EXIT_FAILURE);
}
}
for (int i = 0; i < K; i++) {
printf("%c %d %lf\n", riga[i].c, riga[i].ni, riga[i].nr);
}
free(riga);
} else {
fprintf(stderr, "Non-negative integer expected\n");
exit(EXIT_FAILURE);
}
return 0;
}
您已定义 int *riga
。因此,您的前两个 for
循环将存储数据。也就是说,riga
是指向 int
.
的一维数组的指针
所以,你的前两个 for
循环没问题。
但是,在你的第三个 for
循环中你做了:
riga[x] = malloc(sizeof(dati));
你_dereference riga
,所以这是一个 int
但你正在分配一个 pointer
riga
[再次] 是指向 int
数组的指针,而 不是 指向 struct
数组的指针,所以你可以不做(例如):
riga[i].c
不清楚您有什么数据或您想如何存储它。有两种解读:
- 您似乎想要输入 两个 个单独的数组。首先,一个长度为
K
的 int
的简单一维数组,您称之为 riga
。并且,您的 dati
结构的单独数组,长度也为 K
- 你只需要一个结构数组
dati
长度K
我根据您的需要重构了代码[并进行了一些猜测]。
我选择解释(1)是因为它最接近你的代码。当它引用您的 dati
结构时,我将 riga
重命名为 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 K\n");
scanf("%d %d %d", &a, &b, &K);
printf("%d %d %d\n", 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("%d\n", 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 %lf\n", riga[j].c, riga[j].ni, riga[j].nr);
#else
for (int i = 0; i < K; i++)
printf("%c %d %lf\n", datarray[i].c, datarray[i].ni, datarray[i].nr);
#endif
return EXIT_SUCCESS;
}
为此,我根据标准输入给定的维度创建了一个指向数组,我为数组中的每个结构分配了内存。 这有什么意义吗?我该如何解决这个问题? 编辑,因为 riga[x] 是一个整数,我如何将结构与数组连接起来?编辑 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 K\n");
scanf ("%d %d %d",&a,&b,&K);
printf("%d %d %d\n", 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("%d\n", 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 %lf\n", riga[j].c,riga[j].ni,riga[j].nr);
exit(EXIT_SUCCESS);
}
它在第 28 行中给了我一个警告“警告:从‘void *’赋值给‘int’使得没有强制转换的指针成为整数 [-Wint-conversion]
“
以及打印结构“错误:请求成员‘c’不是结构或联合的错误”
您的变量 riga 需要是 dati 的数组。您还需要检查对 scanf 的调用是否成功。要跳过前导白色 space,您需要在格式字符串中的 %c
之前添加 space。为了使内存分配更容易,我总是为此使用宏函数。这是一个解决方案:
#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: %s\n", 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 %d\n", i + 1);
exit(EXIT_FAILURE);
}
}
for (int i = 0; i < K; i++) {
printf("%c %d %lf\n", riga[i].c, riga[i].ni, riga[i].nr);
}
free(riga);
} else {
fprintf(stderr, "Non-negative integer expected\n");
exit(EXIT_FAILURE);
}
return 0;
}
您已定义 int *riga
。因此,您的前两个 for
循环将存储数据。也就是说,riga
是指向 int
.
所以,你的前两个 for
循环没问题。
但是,在你的第三个 for
循环中你做了:
riga[x] = malloc(sizeof(dati));
你_dereference riga
,所以这是一个 int
但你正在分配一个 pointer
riga
[再次] 是指向 int
数组的指针,而 不是 指向 struct
数组的指针,所以你可以不做(例如):
riga[i].c
不清楚您有什么数据或您想如何存储它。有两种解读:
- 您似乎想要输入 两个 个单独的数组。首先,一个长度为
K
的int
的简单一维数组,您称之为riga
。并且,您的dati
结构的单独数组,长度也为K
- 你只需要一个结构数组
dati
长度K
我根据您的需要重构了代码[并进行了一些猜测]。
我选择解释(1)是因为它最接近你的代码。当它引用您的 dati
结构时,我将 riga
重命名为 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 K\n");
scanf("%d %d %d", &a, &b, &K);
printf("%d %d %d\n", 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("%d\n", 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 %lf\n", riga[j].c, riga[j].ni, riga[j].nr);
#else
for (int i = 0; i < K; i++)
printf("%c %d %lf\n", datarray[i].c, datarray[i].ni, datarray[i].nr);
#endif
return EXIT_SUCCESS;
}