【发布时间】:2022-01-04 13:35:56
【问题描述】:
我在函数内部初始化数组指针的值,首先分配它,然后在读取值时迭代分配它的内容(结构指针)。
这些是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"); 行会在打印时返回分段错误。
【问题讨论】:
-
这是什么 Richiesta richiesta = malloc(sizeof(struct richiesta));?!
-
Richiesta 是一个自定义 typedef,一个指向结构 richiesta 的指针,因此分配了堆中所需的空间@VladfromMoscow
-
代码没有意义。您没有在此语句中分配指针数组 *richieste = calloc(*n, sizeof(struct richiesta));
-
旁注:当使用多个指针变量从函数返回多个值时,请使用临时变量,并且只在函数末尾分配给您的指针。这样您就不必一直遵循变量,并且更容易处理可能的错误情况。现在你到处都有
*n和(*richieste),这使得代码更难阅读。 -
请注意代码不能遗漏重要信息,
struct richiesta和Richiesta的定义都是这样的。请创建minimal reproducible example 并删除不相关的东西,如变量t。
标签: arrays c struct dynamic-memory-allocation typedef