2016-06-09 1 views
2

bonjour amis :) je pratique la programmation en C. Dans ce programme, j'ai une tâche à faire un tableau de chaîne. Je ne sais pas quel est le problème ici ... probablement quelque chose realloc, erreur que je reçois est _crtisvalidheappointerC double pointeur erreur realloc

#define _CRT_SECURE_NO_WARNINGS 
#define MAX 100 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
void readString(char **s) 
{ 
int i = 0; 
char c; 
printf("\nInput string:  "); 
while ((c = getchar()) != '\n') 
{ 
    i++; 
    *s = realloc(*s, i*sizeof(char*)); 
    if (*s == NULL) { printf("Memory allocation failed!"); exit(1); } 
    (*s)[i - 1] = c; 
} 
*s = realloc(*s, (i + 1)*sizeof(char)); 
if (*s == NULL) { printf("Memory allocation failed!"); exit(1); } 
(*s)[i] = '\0'; 
} 


char **load_words() 
{ 
int cnt=0,wordcnt=0,i=0; 
char **words = NULL, *input = NULL; 
readString(&input); 
while (input[cnt] != '\0' && cnt < strlen(input)) 
{ 
    words = realloc(words, ++wordcnt);//errors in second repeat of the loop 
    words[wordcnt] = malloc(MAX); 
    i = 0; 
    while (input[cnt] != ' ') 
    { 
     words[wordcnt][i++] = input[cnt++]; 
    } 
    words[wordcnt][i] = '\0'; 
    realloc(words[wordcnt], (i + 1)*sizeof(char)); 
} 
realloc(words, wordcnt); 
free(input); 
return words; 
} 

void main() 
{ 
int i; 
char **words = NULL; 
words = load_words(); 
scanf("%d", &i); 
} 

quelqu'un peut me aider et dites-moi qu'est-ce que je fais mal ici? cette fonction doit renvoyer un tableau de chaînes mais array doit être un double pointeur (matrice de chaînes)

+0

void readString (char ** s) fonctionne correctement – hd130664d

+2

'' s = realloc (* s, i * sizeof (char *)); 'et' * s = realloc (* s, (i + 1) * sizeof (char)); ':' char * 'vs' char', suspect. – MikeCAT

Répondre

1

Vous utilisez realloc mais vous n'enregistrez pas sa valeur de retour nulle part. Cela signifie que les pointeurs que vous avez toujours pointent vers la mémoire qui a été libérée et la mémoire nouvellement allouée est divulguée.

Regardez la fonction de travail et vous verrez comment l'utiliser correctement.

3

Vous devez changer

words = realloc(words, ++wordcnt); 

à

words = realloc(words, ++wordcnt * sizeof(*words)); 

Sinon, vous n'êtes pas allouez assez de mémoire.


words[wordcnt] = malloc(MAX); 

Cela n'est pas correct, vous devez accéder words[wordcnt-1].

1

Une chose à réaliser quand réaffectant une double pointeur est que la taille de type à realloc est toujours le sizeof (un pointeur). Il en sera de même sur n'importe quel système quel que soit le type de données en question. Vous pouvez génériquement réallouer un double pointeur comme suit:

/** realloc array of pointers ('memptr') to twice current 
* number of pointer ('*nptrs'). Note: 'nptrs' is a pointer 
* to the current number so that its updated value is preserved. 
* no pointer size is required as it is known (simply the size 
* of a pointer) 
*/ 
void *xrealloc_dp (void *ptr, size_t *n) 
{ 
    void **p = ptr; 
    void *tmp = realloc (p, 2 * *n * sizeof tmp); 
    if (!tmp) { 
     fprintf (stderr, "xrealloc_dp() error: virtual memory exhausted.\n"); 
     exit (EXIT_FAILURE); /* or break; to use existing data */ 
    } 
    p = tmp; 
    memset (p + *n, 0, *n * sizeof tmp); /* set new pointers NULL */ 
    *n *= 2; 
    return p; 
} 

Note: l'appel memset est facultative, mais utile si vous avez initialisé tous les pointeurs non affectés à NULL (par exemple lors de l'utilisation NULL comme vous êtes libre de passer un paramètre de réglage du nombre exact de pointeurs à augmenter (éléments à ajouter) ou de changer le multiplicateur pour l'allocation actuelle selon les besoins de votre code.