l'allocation dynamique de tableau de pointeurs
Le code suivant donne une erreur de segmentation. Je ne suis pas en mesure de comprendre pourquoi. Veuillez voir..
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **ptr;
int *val;
int x = 7;
val = &x;
*ptr = (int *)malloc(10 * sizeof (*val));
*ptr[0] = *val;
printf("%d\n", *ptr[0] );
return 0;
}
sur le débogage à l'aide de gdb, il dit:
Program received signal SIGSEGV, Segmentation fault.
0x0804843f in main () at temp.c:10
*ptr = (int *)malloc(10 * sizeof (*val));
Toute aide concernant la question est apprécié.
En gros, je veux allouer dynamiquement un tableau de pointeurs.
Pour moi, pas seg - fautes !!!!
Vous ne pouvez pas faire
Je reçois dans ma tête quand j'ai lu le code. Il fait mal. Si vous n'obtenez pas un, alors vous êtes juste de la chance.
Pour moi, pas seg - fautes !!!!
Vous ne pouvez pas faire
*ptr
jusqu'à ce que vous avez donné pour la première fois ptr
une valeur. C'est pourquoi il segmentation.*ptr = (int *)malloc(10 * sizeof (*val));
est juste affectation de 10*intsize. Ne sais pas ce que vous essayez de faireJe reçois dans ma tête quand j'ai lu le code. Il fait mal. Si vous n'obtenez pas un, alors vous êtes juste de la chance.
OriginalL'auteur Vivek Sethi | 2012-09-25
Vous devez vous connecter pour publier un commentaire.
Première instruction déclare un double pointeur.
Deuxième déréférence le pointeur. Afin que vous êtes en mesure de déréférencer le pointeur de devrait point pour certains de mémoire valide. il n'est pas d'où l'seg fault.
Si vous avez besoin d'allouer suffisamment de mémoire pour un tableau de pointeurs dont vous avez besoin:
Maintenant
ptr
points à une mémoire assez grande pour contenir10
des pointeurs versint
.Chacun des éléments du tableau qui lui-même est un pointeur peut maintenant être consulté à l'aide de
ptr[i]
où,Mais comment se fait-il ne montre pas seg fault dans une autre machine et pour moi il fait?
Lorsque vous faites des erreurs, comme ce que vous appelez comportement indéfini. Il n'est pas garanti que vous obtiendrez une erreur de segmentation, c'est juste le résultat d'un déréférencement invalide emplacements de mémoire. C'est essentiellement la chance de pot qui valide emplacement de la mémoire vous sont déréférencement depuis votre pointeur est non initialisée et détient un certain arbitraire, inconnu valeur sous-jacente (généralement de tout ce qui a été laissé là par une autre fonction ou d'un programme). Donc, vous voyez, il est complètement non-déterministe que ce sera "pris".
OriginalL'auteur Alok Save
OriginalL'auteur Kludas
Voir le programme ci-dessous, peut-être, il aide à mieux comprendre.
Espère que cela aide.. ;).
OriginalL'auteur Whoami
Conceptuellement si vous utilisez **ptr, alors vous avez besoin de alloacte mémoire pour le ptr & *ptr pour defrence **ptr.
Mais dans votre cas vous êtes alloacting mémoire uniquement pour *ptr,si votre compilateur est assez intelligent
son alloacting de la mémoire pour les ptr(un pointeur) à link *ptr,par conséquent, il pourrait en mesure de relier ptr->ptr->*ptr.Par conséquent, vous n'obtenez pas Seg Fault.
OriginalL'auteur Karthik G
inclure
inclure
Ci-dessus serait de travailler.
Vous pouvez trouver la différence et comprendre la raison.
Ligne du bas vous ont été dé-référencement **ptr sans allouer de la mémoire.
OriginalL'auteur tanweer alam