Probleme d'allocation mémoire en C (malloc)

Fermé
LSA Chateau's Team - 10 juil. 2009 à 14:29
 Cédric - 21 janv. 2010 à 22:45
Bonjour,
J'ai un problème avec malloc en C.
La fonction malloc me renvoie plusieur fois de suite la même place mémoire déjà alloué.
Je ne vois pas comment régler ce problème et n'ai pas trouvé de réponse sur internet, peut être quelqu'un peu m'aider ici.
Comme il sagit d'un programme pour mon travail, je ne peux pas montrer beaucoup du code mais en gros, j'ai ça :

int row;
[...]
newMatrix->spindles = malloc(row*sizeof(int));
newMatrix->rowSplitters = malloc(row*sizeof(int));
newMatrix->ticks = malloc(row*sizeof(int *));
[...]

avec comme resultat :
row <- 1

newMatrix->spindles <- 0x01F53C68
newMatrix->rowSplitters <- 0x01F53C78
newMatrix->ticks <- 0x01F53C68

j'ai essayé de bouclé par la suite de cette manière :

int row;
[...]
newMatrix->spindles = malloc(row*sizeof(int));
newMatrix->rowSplitters = malloc(row*sizeof(int));
newMatrix->ticks = malloc(row*sizeof(int));
while ((int)newMatrix->ticks==(int)newMatrix->spindles) {
newMatrix->ticks = malloc(row*sizeof(int));
}
[...]

mais le resultat est le même le malloc ne cèsse de renvoyer le même pointeur à 'newMatrix->ticks'.

Si quelqu'un sais comment je pourrais résoudre ce problème, merci de m'aider.

Merci d'avance,
LSA Chateau's Team

8 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
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 ?
0
LSA Chateau's Team
10 juil. 2009 à 15:04
//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;
0
LSA Chateau's Team
10 juil. 2009 à 15:14
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.
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
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 :

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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LSA Chateau's Team
10 juil. 2009 à 15:54
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.
0
LSA Chateau's Team
10 juil. 2009 à 16:04
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.
0
LSA Chateau's Team
10 juil. 2009 à 16:17
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
0
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
0