l'allocation de mémoire à l'aide de calloc et de libérer de la
gcc 4.4.4 c89
J'ai un programme que je suis en train de tester. J'ai créer un struct objet appelé nom_périphérique n', et allouer de la mémoire pour que je puisse remplir les éléments. Je les affiche, puis libérer la mémoire qui a été allouée.
Cependant, j'obtiens l'erreur suivante:
invalid operands to binary != (have ‘struct Devices_names’ and ‘void *’)
Qui est dans ma boucle for pour afficher les éléments de la structure. Cependant, je sens que je suis en train de tester pour un pointeur NULL.
Juste une autre question, est-il un problème avec le libre?
Merci beaucoup 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++);
}
}
OriginalL'auteur ant2009 | 2010-11-30
Vous devez vous connecter pour publier un commentaire.
Puisque vous n'avez qu'une affectation à la création de l'ensemble de la
devname
tableau, vous avez uniquement besoin de vérifier que la pile de disques pourNULL
, et seulement besoin de gratuit que un tableau. Comme vous êtes à la recherche par le biais dedevname
, chaque entrée est en fait unstruct Devices_names
, pas un pointeur, donc il ne peut pas être comparé avecNULL
ou libéré de façon significative. Dans ce cas, vous aurez besoin d'un autre variable qui suit combien de les inscriptions qui y sont:Vous êtes à la création de espace pour les cinq objets, mais vous ne sont en fait d'allouer un espace contigu. Une bonne règle de base est que chaque appel à
malloc()
oucalloc()
doit correspondre exactement à un appel àfree()
.Merci, je vais le rappeler. Sonne comme une règle simple à suivre.
OriginalL'auteur Justin Spahr-Summers
devname[i]
n'est pas un pointeur ses unstruct Devices_names
, donc la comparaison n'a aucun sens.OriginalL'auteur Let_Me_Be
Où vous écrivez:
que vous testez NULL, une instance de Device_names, pas un pointeur. Il serait bien si vous aviez un tableau de pointeurs Device_names.
L'autre problème, c'est que vous allouez un seul Device_names, de sorte que vous n'avez pas un tableau.
OriginalL'auteur Simone
Après
calloc
vous avez seulement besoin de test pour le pointeur retourné à être non-nulle (etcalloc
appel a réussi).Mais une fois que vous
calloc
auf s i indiqué un tableau, vous ne pouvez pas déterminer le nombre d'éléments dans l'attribution d'avoir seulement pointeur, donc nidevname[i] != NULL
, nidevname+i != NULL
ne fonctionnera pas, bien qu'deuxième compilation. Seulement l'environnement ou RTL le savoir. Et c'est la grande différence entre*alloc
l'allocation et la statique de la déclaration (même s'il est de taille variable, comme indiqué dans le C99). Si vous avez BESOIN de stocker la taille de l'allocation de tableau d'ailleurs.Rappelez-vous aussi, tableau (ou tout autre morceau de la mémoire) attribué avec un seul
calloc()
devrait être libéré avec une seulefree()
appel avec le MÊME pointeur retourné par malloc. En passant tout autre pointeur versfree()
cause undefined behaviaour (qui est souvent un ÉCHEC).De sorte que votre code devrait être:
OriginalL'auteur Vovanium