-2
votes

Mon programme se bloque chaque fois que j'essaie de délocaliser l'ancienne mémoire

Il existe donc une fonction qui alloue une nouvelle mémoire de pointeur et lorsque j'essaie de délocaliser l'ancien que le programme se bloque essentiellement Mon code

char** AddingToTheBook(char** original, int* size, char *number)
{
    char** newArray = (char**)malloc(sizeof(char*)*(*size));
    //allocating and copying the values
    for (int i = 0; i < *size; i++)
    {
        *(newArray + i) = (char*)malloc(sizeof(char)*(strlen(*(original + i))));
        strcpy(*(newArray + i), *(original + i));
    }

    //allocating a new memory to the new number
    *(newArray + (*size)) = (char*)malloc(sizeof(char)*strlen(number));
    strcpy(*(newArray + (*size)), number);
    (*size)++;
    //delocating the allocated memories 
    for (int i = 0; i < size; i++)
        free(original[i]);
    free(original);

    return newArray;
}

c

4 commentaires

poster comme un texte pas l'image


Veuillez poster un exemple de reproductible minimal . Avez-vous parcouru le code dans un débogueur? C'est la première chose à faire


Et vous n'avez pas besoin ni ne doit pas lancer malloc en C


Compilez avec des avertissements, l'un d'eux vous dira de la comparaison entre Integer et Pointeur - c'est le bogue.


3 Réponses :


0
votes
  1. SHLEN ne renvoie que le nombre de caractères. Faire de la place pour la fin zéro * (Newarray + i) = (Char *) Malloc (Tailleof (Char) * (Strlen (* (Original + I))) +1);
  2. meilleur à strncpy au lieu de Strcpy

  3. Comment pouvez-vous aller * Taille à l'avance dans Newarray : * (Newarray + (* Taille)) = (Char *) Malloc (Tailleof (Char) * SHLEN (NUMBER)); Vous ne pouvez aller que * Taille -1 à l'avance, car il commence à partir de zéro.

  4. dans le pour boucle, il semble que vous avez oublié d'ajouter l'astérisque * pour (int i = 0; i


2 commentaires

Remplaçant aveuglément strcpy () avec strncpy () est dangereux. STRNCPY () Ne garantit pas que la chaîne copiée est terminée avec un caractère NUL.


Point 2. Strncpy est plus dangereux, mais dans ce cas, il est le meilleur. Vous avez alloué assez d'espace



0
votes

Vous libérez trop de votre mémoire d'origine.

Regardez la boucle pour la boucle lorsque vous libérez la mémoire: P>

(*size)++;
//delocating the allocated memories 
for (int i = 0; i < *size - 1; i++)
    free(original[i]);


0 commentaires

0
votes

Vous pouvez utiliser REALLOC à la place

    char **tmp = AddingToTheBook(book, size, "Test String")

    if(tmp)
    {
        book = tmp;
        size++;
    }
    else
    {
        /* do something adding to book failed */
    }


2 commentaires

Cela a-t-il une fuite de mémoire si realloc échoue?


Non, cela renvoie NULL, alors que le pointeur d'origine transmis aux fonctions est conservé. Pas de danger si correctement utilisé