2017-04-20 1 views
0

Je travaille sur un code pour l'école, et est ici le fragment de code que je vais avoir des problèmes avec:« realloc(): pointeur non valide » erreur

// Create file path 
int size_path = 11; 
char* path = malloc(size_path*sizeof(char)); 
path = "./storage/\0"; 
for(i = 0; i < size_filename; i++){ 
    size_path++; 
    path = realloc(path, size_path*sizeof(char)); 
    path[size_path-1] = filename[i]; 
} 
path[size_path] = '\0'; 

Essentiellement, ce que je fais essaie de trouver l'existence d'un fichier (par exemple, test.txt) et donc j'ai besoin d'utiliser access() pour vérifier son existence, mais d'abord je dois construire le path lui-même tel que path = "./storage/test.txt" J'ai déjà utilisé la méthode ci-dessus pour analyser certains d'autres choses, donc je sais que la façon dont je le fais fonctionne, je pense juste qu'il me manque quelque chose ici parce que chaque fois que j'essaye d'exécuter le code, j'obtiens une erreur dans le compilateur: *** Error in ./a.out: realloc(): invalid pointer: 0x00000000004016c7 ***Je suis curieux de voir quelle perspicacité vous pouvez me donner parce que je travaille sur ce bug depuis au moins une demi-heure et la communauté m'a aidé à résoudre de nombreux problèmes en quelques minutes, alors je Je suis sûr que c'est juste une chose hors-par-un, mais je ne peux pas vraiment comprendre où il serait. Merci d'avance!

EDIT: Comme je l'ai imaginé, j'ai eu la réponse à ma question en moins de 5 minutes. Il s'avère que j'ai fuit accidentellement la mémoire allouée dynamiquement en n'y mettant rien et en l'allouant de manière statique directement après. Au lieu de cela, j'ai utilisé strcpy(path, "./storage/") et j'ai obtenu exactement la fonctionnalité que je recherchais. Je vous remercie!

+0

Lire [demander] et en particulier la partie sur [les devoirs] (https://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions). – Olaf

+1

'path =" ./storage/\0 ";' assigne 'path' qui vient juste d'être initialisé avec' char * path = malloc (chemin_dimension * sizeof (char)); 'Cela fuit l'allocation précédente. – chux

+3

Probablement, 'path =" ./storage/\0 ";' devrait être 'strcpy (chemin," ./storage/");' – ShadowRanger

Répondre

3
char* path = malloc(size_path*sizeof(char)); 
path = "./storage/\0"; 

Ainsi, les points de chemin à une mémoire allouée dynamiquement, sur la ligne suivante, vous dites path = something_else si:

  1. Vous avez fui la mémoire allouée dynamiquement (parce que vous ne disposez pas d'un pointeur il plus, donc ne peut pas y avoir accès à free il)
  2. Vous ne pouvez pas non realloc mémoire dynamique

lecture b Et entre les lignes de la question, je dirais que vous n'avez même pas besoin de mémoire dynamique du tout. Vous pouvez simplement utiliser un tampon de taille fixe:

char path[128]; // arbitrary limit that we "know" is ok given our data 
char* filename = "test.txt"; 
sprintf(path, "/storage/%s", filename); 

Évidemment, cela est adapté à prendre le nom de fichier pourrait effectivement changer en fonction de certaines données, sinon le lot entier pourrait être une chaîne littérale.

+0

c'est exactement ce que je pensais, et donc vraisemblablement, comme le commentateur mentionné ci-dessus, je devrais utiliser 'strcpy()' pour obtenir la chaîne que je veux dans la mémoire allouée. Merci beaucoup! –

+0

Avez-vous réellement besoin de mémoire dynamique en premier lieu? Vous n'avez certainement pas besoin de 'realloc'. Vous pouvez simplement utiliser un tampon de taille fixe comme point de départ ... – John3136

+0

Je suppose que vous avez raison; Je pourrais utiliser un tampon fixe et obtenir le même résultat. De toute façon, je suis content de savoir maintenant pour l'avenir lorsque ce problème se pose –