A voir également:
- Probleme d'allocation mémoire en C (malloc)
- Mémoire vive - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Nettoyer memoire iphone - Guide
- Test memoire pc - Guide
- Gmail memoire insuffisante - Guide
8 réponses
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
10 juil. 2009 à 14:48
10 juil. 2009 à 14:48
Bonjour,
Cela fait trèèèss longtemps que je n'ai pas de C (8 ans rien que ça ><), mais je me demandais si ça ne pouvais pas éventuellement venir de la façon dont tu as déclaré ta structure ?
Est-ce qu'il serait possible d'avoir le code de la structure ?
Cela fait trèèèss longtemps que je n'ai pas de C (8 ans rien que ça ><), mais je me demandais si ça ne pouvais pas éventuellement venir de la façon dont tu as déclaré ta structure ?
Est-ce qu'il serait possible d'avoir le code de la structure ?
//Structure for listed matrixes
typedef struct MatrixTag *MatrixPtr;
struct MatrixTag {
int id;
int name;
int labelType;
int labelGPIB;
int labelChan;
int labelActiv;
int type;
int gpib;
int chan;
int activ;
unsigned long defaultRM;
unsigned long resourcesM;
int nbColumn;
int nbRow;
int nbSpindles;
int spindlesChange;
int beginning;
int ending;
int *supplies;
int *columnSplitters;
int labelSpindleName;
int *spindles;
int *rowSplitters;
int **ticks;
MatrixPtr next;
};
typedef struct MatrixTag Matrix;
typedef struct MatrixTag *MatrixPtr;
struct MatrixTag {
int id;
int name;
int labelType;
int labelGPIB;
int labelChan;
int labelActiv;
int type;
int gpib;
int chan;
int activ;
unsigned long defaultRM;
unsigned long resourcesM;
int nbColumn;
int nbRow;
int nbSpindles;
int spindlesChange;
int beginning;
int ending;
int *supplies;
int *columnSplitters;
int labelSpindleName;
int *spindles;
int *rowSplitters;
int **ticks;
MatrixPtr next;
};
typedef struct MatrixTag Matrix;
Cependant, il ne me fait pas l'erreur à chaque passage par ce bout de code, c'est pour un de mes test que l'erreur apparait.
Ce qui me trouble le plus est que malloc me renvoi 2 fois de suite le même pointeur (j'ai fait un passage en debbugue en "pas à pas" pour trouver cette erreur) et cela sans que j'ai alloué beaucoup de mémoire.
Dans certain autre test j'alloue plus de mémoire sans que ça ne provoque ce bug.
Ce qui me trouble le plus est que malloc me renvoi 2 fois de suite le même pointeur (j'ai fait un passage en debbugue en "pas à pas" pour trouver cette erreur) et cela sans que j'ai alloué beaucoup de mémoire.
Dans certain autre test j'alloue plus de mémoire sans que ça ne provoque ce bug.
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
10 juil. 2009 à 15:38
10 juil. 2009 à 15:38
Moi ce qui me saute aux yeux déjà c'est que 'spindles' et 'ticks' ne sont pas du tout la même chose. Or tu les instancie de la même manière dans le code de ta boucle.
Je vais peut-être écrire des erreurs car mon C n'est plus très opérationnel, mais ne serais-ce pas déjà plus propre de préciser les pointeurs :
Est-ce que ca ne fonctionne pas mieux ?
Je vais peut-être écrire des erreurs car mon C n'est plus très opérationnel, mais ne serais-ce pas déjà plus propre de préciser les pointeurs :
newMatrix->spindles = (int *) malloc(row*sizeof(int)); // allocation d'un tableau de x entiers newMatrix->rowSplitters = (int *) malloc(row*sizeof(int)); // allocation d'un tableau de x entiers newMatrix->ticks = (int **) malloc(row*sizeof(int *)); // allocation d'un tableau de tableau de x entier (matrice x par x donc) Et d'instancier correctement ta matrice : while (i=0;i<row;i++) { newMatrix->ticks[i] = malloc(row*sizeof(int)); }
Est-ce que ca ne fonctionne pas mieux ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Le cast en (int *) ou (int **) ne sert pas avec un malloc, ce sont des pointeurs ils ont toujours la même forme.
De plus les casts servent à eviter des erreurs à la compilation (le compilateur cherchant à prévenir des actions inhabituel), or j'ai une erreur à l'execution.
Puis, la boucle n'était pas pour l'initialisation des lignes de 'ticks' mais pour rattraper l'erreur due au malloc.
J'ai tout de même essayé de faire les corrections proposés, mais cela ne change rien à l'execution et à l'erreur.
Merci quand même, si tu as d'autre proposition je suis preneur.
De plus les casts servent à eviter des erreurs à la compilation (le compilateur cherchant à prévenir des actions inhabituel), or j'ai une erreur à l'execution.
Puis, la boucle n'était pas pour l'initialisation des lignes de 'ticks' mais pour rattraper l'erreur due au malloc.
J'ai tout de même essayé de faire les corrections proposés, mais cela ne change rien à l'execution et à l'erreur.
Merci quand même, si tu as d'autre proposition je suis preneur.
Je viens de tenter d'inverser les lignes :
newMatrix->rowSplitters = malloc(row*sizeof(int));
newMatrix->ticks = malloc(row*sizeof(int *));
et cela m'as permis de voir que c'est bien malloc qui après m'avoir fournit un pointeur en 0x01F53C78 ne me fournit plus que le pointeur en 0x01F53C68 déjà alloué, et ce pendant tout le reste du programme jusqu'à ce que ça provoque une erreur.
Si cela peut aider à ce que l'on me trouve une solution.
newMatrix->rowSplitters = malloc(row*sizeof(int));
newMatrix->ticks = malloc(row*sizeof(int *));
et cela m'as permis de voir que c'est bien malloc qui après m'avoir fournit un pointeur en 0x01F53C78 ne me fournit plus que le pointeur en 0x01F53C68 déjà alloué, et ce pendant tout le reste du programme jusqu'à ce que ça provoque une erreur.
Si cela peut aider à ce que l'on me trouve une solution.
J'ai de plus fait un petit test avec printf pour verifier la memoire et la case d'allocation,
le nombre après le '_' correspond à l'indice dans un tableau fictif de int;
Les deux premiers sont des passages dans la fonction sans erreur et avec d'autre valeur d'allocation, je ne sais donc pas si la place est alloué ou non à ce moment là:
Test de memoire (avant spindles):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (entre spindles et ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (apres ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (avant spindles):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (entre spindles et ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (apres ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (avant spindles):
0x01F53C68_-2=24
0x01F53C68_-1=32848992
0x01F53C68_0=3229763
0x01F53C68_1=1952661792
Test de memoire (entre spindles et ticks):
0x01F53C68_-2=8
0x01F53C68_-1=32848992
0x01F53C68_0=3229763
0x01F53C68_1=1952661792
Test de memoire (apres ticks):
0x01F53C68_-2=8
0x01F53C68_-1=32848992
0x01F53C68_0=1754023709
0x01F53C68_1=1952661792
le nombre après le '_' correspond à l'indice dans un tableau fictif de int;
Les deux premiers sont des passages dans la fonction sans erreur et avec d'autre valeur d'allocation, je ne sais donc pas si la place est alloué ou non à ce moment là:
Test de memoire (avant spindles):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (entre spindles et ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (apres ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (avant spindles):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (entre spindles et ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (apres ticks):
0x01F53C68_-2=24
0x01F53C68_-1=0
0x01F53C68_0=1819440195
0x01F53C68_1=1952661792
Test de memoire (avant spindles):
0x01F53C68_-2=24
0x01F53C68_-1=32848992
0x01F53C68_0=3229763
0x01F53C68_1=1952661792
Test de memoire (entre spindles et ticks):
0x01F53C68_-2=8
0x01F53C68_-1=32848992
0x01F53C68_0=3229763
0x01F53C68_1=1952661792
Test de memoire (apres ticks):
0x01F53C68_-2=8
0x01F53C68_-1=32848992
0x01F53C68_0=1754023709
0x01F53C68_1=1952661792
Hello,
Cette question semble dater un peu, mais si cela peux t'éclairer il me semble que le code que tu présente dans tes listing subit la conséquence d'une corruption du heap qui c'est produit plus tôt.
Cela peux être du à l'écrasement de la mémoire au dela des limites d'un des tableau alloué dynamiquement, les informations des méta données de l'allocateur sont alors hasardeuse et peuvent provoquer le comportement que tu décris.
Cédric
www.memspell.com
Cette question semble dater un peu, mais si cela peux t'éclairer il me semble que le code que tu présente dans tes listing subit la conséquence d'une corruption du heap qui c'est produit plus tôt.
Cela peux être du à l'écrasement de la mémoire au dela des limites d'un des tableau alloué dynamiquement, les informations des méta données de l'allocateur sont alors hasardeuse et peuvent provoquer le comportement que tu décris.
Cédric
www.memspell.com