gcc 4.4.4 c89allocation de mémoire à l'aide de calloc et de libération
J'ai un programme que je suis en train de tester. Je crée un objet struct appelé devname et alloue de la mémoire pour que je puisse remplir les éléments. Je les affiche et libère ensuite la mémoire allouée.
Cependant, je reçois l'erreur suivante:
invalid operands to binary != (have ‘struct Devices_names’ and ‘void *’)
qui est dans ma boucle pour afficher les éléments de structure. Cependant, j'ai l'impression de tester un pointeur NULL.
Juste une question supplémentaire, y at-il un problème avec le libre?
Un grand merci pour tous les conseils,
#include <stdio.h>
#include <stdlib.h>
static struct Devices_names {
#define MAX_NAME_LEN 80
int id;
char name[MAX_NAME_LEN];
} *devname;
static void g_create_device_names(size_t devices);
static void g_get_device_names();
static void destroy_devices();
int main(void)
{
#define DEVICES 5
g_create_device_names(DEVICES);
g_get_device_names();
destroy_devices();
return 0;
}
static void g_create_device_names(size_t devices)
{
size_t i = 0;
devname = calloc(devices, sizeof *devname);
if(devname == NULL) {
exit(0);
}
for(i = 0; i < devices; i++) {
devname[i].id = i;
sprintf(devname[i].name, "device: %d", i);
}
}
static void g_get_device_names()
{
size_t i = 0;
for(i = 0; devname[i] != NULL; i++) { <-- ERROR HERE
printf("Device id --- [ %d ]\n", devname[i].id);
printf("Device name - [ %s ]\n", devname[i].name);
}
}
static void destroy_devices()
{
while(devname != NULL) {
free(devname++);
}
}
Quand je l'ai fait la devname suivante = calloc (dispositifs, sizeof * devname). Je pensais que je créais 5 objets devname sur le tas. Donc je devrais libérer tous les 5 d'entre eux. Cependant, dites-vous qu'il n'y a qu'un seul objet alloué? Merci. – ant2009
Vous créez * espace * pour cinq objets, mais vous n'allouez qu'un seul bloc contigu. En règle générale, chaque appel à 'malloc()' ou 'calloc()' devrait correspondre exactement à un appel à 'free()'. –
Merci, je m'en souviendrai. Cela ressemble à une règle facile à suivre. – ant2009