7
votes

Allocation dynamique du tableau des pointeurs

Le code suivant donne une erreur de segmentation. Je ne suis pas capable de comprendre pourquoi. S'il vous plaît voir ..

Program received signal SIGSEGV, Segmentation fault.

0x0804843f in main () at temp.c:10

*ptr = (int *)malloc(10 * sizeof (*val));


6 commentaires

Je veux fondamentalement allouer de manière dynamique un éventail de pointeurs.


Vous ne pouvez pas faire * pTR jusqu'à ce que vous ayez d'abord donné pTR une valeur. C'est pourquoi il segfault.


* PTR = (int *) MALLOC (10 * TAILLEOF (* VAL)); vient d'allouer 10 * Intisize. Ne sais pas ce que vous essayez de faire


@ams, r u obtenir une faute séparante fourgonnette ???


@ rjayavrp, cela pourrait ou non donner une faute SEG en fonction de l'endroit où le pointeur non initialisé réside.


@RJayAvrp J'entiens un dans ma tête quand j'ai lu le code. Ça fait mal. Si vous n'en tirez pas, vous n'avez que de la chance.


5 Réponses :


12
votes
i < 10

3 commentaires

Mais comment se fait-il que cela ne montre pas la faute SEG dans une autre machine et pour moi, cela fait?


@Viveksethi Lorsque vous faites des erreurs comme celle-ci, vous invoquez comportement non défini . Il n'est pas garanti que vous obtiendrez une faute de segmentation; C'est juste le résultat de la déséroférance certains des emplacements de mémoire non valides. Il est essentiellement de la chance sur lequel vous êtes un emplacement de mémoire non valide que vous êtes la déséroférance, car votre pointeur est inintitualisé et contient une valeur sous-jacente arbitraire et inconnue (généralement tout ce qui y était laissé par une autre fonction ou un autre programme). Donc, vous voyez, il est totalement non déterministe que cela sera «attrapé».


Lorsque vous déclarez le pointeur, il reçoit une certaine valeur dans le morceau de mémoire que l'ordinateur l'a donné. Il existe deux options: 1. Si cette valeur est un pointeur valide, dans la mémoire de votre programme, il ne mourra pas de défaut de segmentation. Vous pouvez écrire dans d'autres données cependant. 2. Si la valeur n'est pas dans la mémoire du programme, vous essayez d'utiliser la mémoire qui n'appartient pas à votre processus (ou n'est pas valide), vous obtenez une erreur de segmentation. C'est la même chose qu'une légèreté dit ci-dessus, juste avec d'autres mots.



4
votes
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int **ptr;
    int x;

    x = 5;

    ptr = malloc(sizeof(int *) * 10);
    ptr[0] = &x;
    /* etc */

    printf("%d\n", *ptr[0]);

    free(ptr);
    return 0;
}

0 commentaires

3
votes

Voir le programme ci-dessous, peut-être, il est peut-être utile de mieux comprendre. XXX

J'espère que cela aide ..).


1 commentaires

Eh bien, ce n'était pas exactement ce que je cherchais. Quoi qu'il en soit, il est clair dans mon esprit. Merci.



0
votes

Conceptuellement Si vous utilisez ** PTR, vous devez alors vous avoir besoin de la mémoire alloacte pour PTR & * PTR pour défriger ** PTR.

Mais en vous case, vous êtes une mémoire allueuse uniquement pour * PTR, si votre compilateur est assez intelligent Sa mémoire alluatrice pour PTR (un emplacement de pointeur) à lier * PTR, peut donc pouvoir lier PTR -> pTR -> * ptr.hence Vous n'êtes pas faute de SEG.


0 commentaires

0
votes

Inclure

Inclure H1>
int main()    
{    
    int **ptr;    
    int *val;    
    int x = 7;    
    val = &x;    
    ptr = (int**)malloc(sizeof(int**));    
    *ptr = (int *)malloc(10 * sizeof (*val));    
    *ptr[0] = *val;    
    printf("%d\n", *ptr[0] );    
    return 0;    
}


0 commentaires