数组指针的内容在循环外改变

Content of array pointer is altered outside the loop

我通过首先分配它来初始化函数内部数组指针的值,然后分配其内容(结构指针)迭代读取值。

就是Richiesta的定义和初始化函数的内容:

    typedef struct richiesta {
        int durata;
    } *Richiesta;

    void leggiParametri(Richiesta **richieste, int *n){
        // size
        scanf("%d", n);

        *richieste = calloc(*n, sizeof(struct richiesta));

        //printf("Inside loop:\n");
        for(int i = 0; i < *n; i++){
            Richiesta richiesta = malloc(sizeof(struct richiesta));
            printf("%d\t", richiesta);
            scanf("%d", &richiesta->durata);
            (*richieste)[i] = richiesta;
            printf("%d: %d\n", i, (*richieste)[i]->durata);
        }
        printf("Outside loop:\n");
        printf("%d: %d\n", 0, (*richieste)[0]->durata);
        printf("%d: %d\n", 1, (*richieste)[1]->durata);
    }

main正文:

    Richiesta *richieste = NULL;
    int n = -1;
    leggiParametri(&richieste, &n);

提供以下输入:

6
4
7
3
8
1
5
15

输出为:

-858131760  0: 4
-858127616  1: 7
-858127584  2: 3
-858127552  3: 8
-858127520  4: 1
-858127488  5: 5
Outside loop:
0: -858127520
1: 7

问题只发生在数组的第一个元素上,在 for 循环中它包含读取的正确值,而在外部它包含特定值,对应于第 5 个指向的地址元素(打印为整数)。 (即使在其他函数或主体中打印数组内容也会发生同样的事情)

此外,在打印时取消注释 printf("Inside loop:\n"); returns 行的分段错误。

您没有在此语句中分配指针数组

*richieste = calloc(*n, sizeof(struct richiesta));

您在评论中写的类型说明符 Richiesta 是类型 struct richiesta 的别名。您分配了一个结构数组。

所以这个作业

(*richieste)[i] = richiesta;

没有意义。

你的意思好像是

*richieste = calloc(*n, sizeof( Richiesta ));

注意像这样对指针使用typedef

typedef struct richiesta *Richiesta;

是个坏主意。这只会让代码的读者感到困惑。

您被结构和指向结构的指针的混合所吸引。分配一个指针数组以稍后为每个元素分配一个结构是一种反模式,正确的方法确实是直接分配一个结构数组。但是之后代码会变成:

void leggiParametri(Richiesta* richieste, int* n, int* t) {
    // dimensione
    scanf("%d", n);
    //printf("%d\n", *n);
    *richieste = calloc(*n, sizeof(struct richiesta));

    // richieste
    //printf("Inside loop:\n");
    for (int i = 0; i < *n; i++) {
        Richiesta richiesta = *richieste + i;
        printf("%p\t", richiesta);
        scanf("%d", &(richiesta->durata));
        printf("%d: %d\n", i, (*richieste)[i].durata);
    }
    printf("Outside loop:\n");
    printf("%d: %d\n", 0, (*richieste)[0].durata);
    printf("%d: %d\n", 1, (*richieste)[1].durata);

    // tempo
    scanf("%d", t);
    //printf("%d\n", *t);
}

然后您可以这样调用该函数:

Richiesta richieste = NULL;
int n, t;
leggiParametri(&richieste, &n, &t);
// other processing....
free(richieste);
  1. 不要将指针隐藏在 typedef 之后。这是一个非常糟糕的做法。
  2. 无特殊需要请勿使用副作用。你只分配一维数组,你应该使用函数 return value.
typedef struct Richiesta
{
    int durata;
} Richiesta;

Richiesta *leggiParametri(int *n)
{
    Richiesta *richiesta = NULL;
    // size
    if(scanf("%d", n) != 1) { /*error handling */};

    if(n >= 0)
    {
        richiesta = calloc(*n, sizeof(*richiesta));
        //printf("Inside loop:\n");
        for(int i = 0; i < *n; i++)
        {
            scanf("%d", &richiesta[i].durata);
            printf("%d: %d\n", i, richiesta[i].durata);
        }
        printf("Outside loop:\n");
        printf("%d: %d\n", 0, richiesta[0].durata);
        printf("%d: %d\n", 1, richiesta[1].durata);
    }
    return richiesta;
}
``