数组指针的内容在循环外改变
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);
- 不要将指针隐藏在
typedef
之后。这是一个非常糟糕的做法。
- 无特殊需要请勿使用副作用。你只分配一维数组,你应该使用函数 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;
}
``
我通过首先分配它来初始化函数内部数组指针的值,然后分配其内容(结构指针)迭代读取值。
就是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);
- 不要将指针隐藏在
typedef
之后。这是一个非常糟糕的做法。 - 无特殊需要请勿使用副作用。你只分配一维数组,你应该使用函数 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;
}
``