c - 如何将无符号整数存储在结构数组中?
问题描述
我正在为学校做一个项目,但遇到了一个问题,我无法将数据存储到结构数组中的无符号 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];
和
prueba array[10];
为什么在数组中存储十个结构指针并将结构存储在外部存储器中,而您也可以在数组中存储十个结构?array[x]->y
您现在可以使用而不是使用来访问值array[x].y
。
如果您不想在堆栈上执行此操作,您还可以执行以下操作:
prueba * array = calloc(10, sizeof(prueba));
现在您还创建了一个直接包含 10 个结构的数组,只是不在堆栈上,而是在堆上,最后您使用
free(array);
推荐阅读
- c++ - 通过 lambda 函数转发附加参数
- powershell - 无法在powershell脚本中用逗号替换空格
- azure - 删除服务/入口控制器时如何使 Azure 不删除公共 IP?
- powershell - 类实例事件字段始终为空
- bash - 关于bash中日期命令的完整日期格式
- python-3.x - Boto3 运行 ec2 后只返回一个实例 id
- angular - 如何查看 observables 的运行时值
- flutter - gradle build 卡在执行 :app:compileFlutterBuildDebug
- python - 如何将包含 DateTimeField 的 Django 查询集转换为 Pandas 日期时间索引?
- java - GraalVM 原生镜像和 Oracle ojdbc11-21.1