首页 > 解决方案 > 如何将无符号整数存储在结构数组中?

问题描述

我正在为学校做一个项目,但遇到了一个问题,我无法将数据存储到结构数组中的无符号 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;
}

标签: c

解决方案


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);


推荐阅读