我必须在 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

不清楚您有什么数据或您想如何存储它。有两种解读:

  1. 您似乎想要输入 两个 个单独的数组。首先,一个长度为 Kint 的简单一维数组,您称之为 riga。并且,您的 dati 结构的单独数组,长度也为 K
  2. 你只需要一个结构数组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;
}