2010-05-25 3 views
0

je suis une erreur folle dans cette boucle forCallin' c de heurtes lua tout en réaffectant

matr=realloc(matr, newmax*sizeof(matr*)); 

for (i=0; i<newmax; i++){ 
    matr[i]=realloc(matr[i], newmax*sizeof(int)); 
} 

matr est un tableau à plusieurs dimensions: int ** matr. J'ai besoin de redimensionner la colonne et la ligne. La première ligne redimensionne la colonne et la boucle for redimensionne chaque ligne. ça a bien fonctionné dans c. maintenant je travaille sur une bibliothèque pour lua et ça tombe en panne ici. compilin 'fonctionne bien aussi. mais appelant de lua accidents avec

lua: malloc.c:3552: mremap_chunk: Assertion `((size + offset) & (mp_.pagesize-1)) == 0' failed. 

Je n'ai aucune idée sacrément, car il fonctionne très bien en utilisant c.

+0

sont des pointeurs vers « matr » stockés à l'intérieur de l'interpréteur de Lua? Peut-être que l'interpréteur utilise le vieux pointeur quelque part après que le tableau a été réaffecté. – Rudi

+0

mtr fait partie d'une struct in c. et cette structure est représentée par userdata pour lua. – mkind

+1

Ce n'est pas lié à Lua. – lhf

Répondre

7

Après avoir appelé realloc, le contenu de la partie nouvellement allouée est indéterminé. Cela signifie qu'appeler realloc sur les nouvelles lignes peut échouer car il essaie de réaffecter un pointeur non valide.

Vous pouvez utiliser realloc sur les anciennes lignes et malloc sur les nouvelles lignes pour résoudre ce problème. Ou vous pouvez zéro la nouvelle partie après la première realloc, puis votre boucle travailler est:

matr=realloc(matr, newmax*sizeof(matr*)); 
for (i=oldmax; i<newmax; i++) 
    matr[i] = NULL; 

for (i=0; i<newmax; i++){ 
    matr[i]=realloc(matr[i], newmax*sizeof(int)); 
} 
+0

que voulez-vous dire par "vous pouvez zéro la nouvelle partie"? – mkind

+0

J'ai ajouté du code pour le montrer. Cela fonctionne parce que realloc se comporte comme malloc quand passé un pointeur nul. – interjay

+0

ok, cela semble fonctionner pour l'instant. la nouvelle erreur de segmentation est causée par quelque chose de différent, je pense. – mkind