我正在做一个学校项目,但遇到一个问题,就是我无法将数据存储到结构数组中的unsigned int。从控制台(./project)运行它时,我没有任何错误,并且结果显示正确。但是,当使用valgrind运行它时,在尝试写入无符号值时出现“无效写入”错误,而在尝试读取无符号值时出现“无效读取”错误。
这里是具有相同问题的简化代码:
#include <stdio.h>
#include <stdlib.h>
struct prueba{
int num;
char letra;
unsigned int nam;
};
typedef struct prueba prueba;
int main(){
prueba * array[10];
for (int i=0; i<10; i++){
array[i]=malloc(sizeof(prueba *));
}
for (int i=0; i<10; i++){
array[i]->num=i;
array[i]->letra='P';
array[i]->nam=i*i;
}
for (int i=0; i<10; i++){
printf("%d ", array[i]->num);
printf("%c ", array[i]->letra);
printf("%u", array[i]->nam);
printf("\n");
}
for (int i=0; i<10; i++){
free(array[i]);
}
return 0;
}
array[i]=malloc(sizeof(prueba *));
不正确。必须是
array[i]=malloc(sizeof(prueba));
[第一个保留足够大的内存,以便可以将prueba结构的指针放进内部,但是您想要的是足够大的内存,以便将整个prueba结构放进去。
但是您可以通过替换来保存所有这一切
prueba * array[10];
with
prueba array[10];
为什么还要在数组中存储十个结构,为什么在数组中存储十个指向结构的指针并将结构存储在外部存储器中?现在可以不用array[x]->y
来使用array[x].y
来访问值。
如果您不想在堆栈上这样做,也可以这样做:
prueba * array = calloc(10, sizeof(prueba));
现在您还创建了一个直接包含10个结构的数组,只是不在堆栈上,而是在堆上,最后,您可以使用以下所有元素来释放它们:
free(array);