Dans le premier fichier .h, j'ai cette structure:

typedef struct system
{
    char* name;
    DArray Info;
} *System;

Et dans le fichier .c, j'ai cette fonction:

System createSystem(char *name){
    if (!name){
        return NULL;
    }
    System newSystem=malloc(sizeof(*newSystem));
    if (!newSystem){
        return NULL;
    }
    newSystem->name=malloc(sizeof(strlen(name)+1));
    if (!newSystem->name){
       free(newSystem);
       return NULL;
    }
    strcpy(newSystem->name,name);
    newSystem->Info=malloc(sizeof *(newSystem->Info));
        if (!newSystem->Info){
            free(newSystem->name);
            free(newSystem);
            return NULL;
        }
        newSystem->Info->x=0;
        newSystem->Info->elements=NULL;
    return newSystem;
}

Dans un autre fichier .h, j'ai le struct dArray:

typedef struct dArray
{
   int x;
    Element *elements;
} *DArray;

Element peut être de n'importe quel type.

Cependant, la fonction cesse toujours de fonctionner dans Eclipse et j'obtiens l'erreur

hw a cessé de fonctionner

Je sais que le problème est dans cette ligne:

 newSystem->Info=malloc(sizeof(*newSystem->Info));

Mais je ne comprends pas pourquoi c'est un problème car j'essaye de malloc au struct DArray d'une manière régulière!

J'utilise ce test dans le fichier principal:

int main() {
sys=createSystem("ss1");
if (sys) {
printf ("ok");
return 0;
}

Toute aide serait appréciée.

-1
mamama 24 nov. 2017 à 19:46

3 réponses

Meilleure réponse
System createSystem(char *name){
    if (!name){
        return NULL;
    }
    System newSystem=malloc(sizeof *newSystem);
    if (!newSystem){
        return NULL;
    }
    newSystem->name=malloc(sizeof *newSystem->name * (strlen(name)+1)); // <-- change here.
    if (!newSystem->name){
       free(newSystem);
       return NULL;
    }
    strcpy(newSystem->name,name);
    newSystem->Info=malloc(sizeof *newSystem->Info);
        if (!newSystem->Info){
            free(newSystem->name);
            free(newSystem);
            return NULL;
        }
        newSystem->Info->x=0;
        newSystem->Info->elements=NULL;
    return newSystem;
}

Si vous copiez la chaîne dans une mémoire allouée dynamiquement, elle (malloc) alloue essentiellement sizeof (strlen(str)+1) octets de mémoire. Et ce ne sera rien d'autre que l'opérateur sizeof appliqué à size_t qui est peu susceptible de contenir une chaîne de caractères. (5 caractères dans ma machine). (pourquoi size_t? Parce que la fonction strlen a une signature size_t strlen(const char *s);)

Également dans mon système sizeof size_t est 4 octets. Donc, fondamentalement, vous allouez 5 octets. Cela signifie que la chaîne se compose de 5 caractères, y compris le caractère de fin nul.

Tout ce qui dépasse la longueur vient comme "ABCDED", vous écrivez hors de la mémoire que vous avez allouée provoquant un accès illégal à la mémoire - et cela a un comportement non défini. Dans votre cas, cela s'arrête simplement.

Pour ajouter plus de précision, dans votre cas, je suppose que lorsque vous entrez la chaîne, vous passez quelque chose de plus que la longueur 4. Mais si vous passez la chaîne "ss1", cela fonctionnera.

newSystem->name=malloc(sizeof *newSystem->name * (strlen(name)+1)); peut être écrit plus clairement comme newSystem->name=malloc(strlen(name)+1);. Comme sizeof char est 1 octet, nous l'avons évité.

Vous pouvez ultérieurement essayer de rechercher la strdup fonction qui ne fait pas partie de la norme ISO.

0
user2736738 24 nov. 2017 à 19:26

La déclaration ci-dessous ne sont pas correctes: -

System newSystem=malloc(sizeof(*newSystem)); ça devrait être System newSystem=malloc(sizeof(struct system));

Et newSystem->Info=malloc(sizeof *(newSystem->Info)); est newSystem->Info est un pointeur? si le pointeur doit être newSystem->Info=malloc(sizeof(DArray));

0
Abhijit Pritam Dutta 24 nov. 2017 à 19:18

De plus, ce qui suit n'est pas du tout ce que vous recherchez: newSystem-> name = malloc (sizeof (strlen (name) +1));

Cela va à malloc () un tampon de (au minimum) sizeof (size_t) pas un tampon capable de contenir strlen (nom) +1 octets - size_t est le type de retour de strlen et c'est à quoi la sizeof est appliquée .

0
SoronelHaetir 24 nov. 2017 à 18:42
47477317