Un débordement de pile C++
C'est mon code. Quand j'ai accès dtr tableau dans initImg fonction, il donne une exception de dépassement de pile. Quelle pourrait être la raison?
#define W 1000
#define H 1000
#define MAX 100000
void initImg(int img[], float dtr[])
{
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
img[i*W+j]=255;
for(int j=0;j<H;j++)
{
img[j] = 0;
img[W*(W-1)+j] = 0;
}
for(int i=0;i<W;i++)
{
img[i*W] = 0;
img[i*W+H-1] = 0;
}
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
{
if(img[i*W+j]==0)
dtr[i*W+j] = 0; //<------here
else
dtr[i*W+j] = MAX; //<------here
}
}
int main()
{
int image[W*H];
float dtr[W*H];
initImg(image,dtr);
return 0;
}
OriginalL'auteur user570593 | 2011-06-02
Vous devez vous connecter pour publier un commentaire.
Ce:
Crée chaque un 4 * 1000 * 1000 ~ 4 MO de tableau dans la pile. La pile de l'espace est limité, et généralement c'est moins de 4 MO. Ne pas le faire, de créer des tableaux dans le tas à l'aide de nouveau.
std::vector
?Pourquoi utiliser une structure dynamique pour les données statiques? Si tout ce qu'il fait est d'itérer sur un connu de la taille de la matrice de l'utilisation connu un tableau de taille puisqu'il correspond exactement le problème.
Vous êtes en train de créer dynamiquement un tableau de taille tout de même, il arrive juste à être de taille connue. En utilisant de nouveaux directement permettra à des fuites de mémoire et a une mauvaise/pas de prise en charge du débogage pour le hors-limites des accès, entre autres choses.
std::vector<int> image(W * H);
effectue la même fonction, dans beaucoup de moyen plus sûr.Des œuvres. Merci verymuch
Comment est-il dynamiquement un tableau de taille si ce n'est pas d'augmenter ou de réduire? Si un tel cas, les causes de sortir des limites d'accès ou des fuites de mémoire, vous ne devriez pas utiliser std::vector parce que vous ne savez pas ce que vous faites. Apprendre les bases avant d'utiliser d'autres solutions.
OriginalL'auteur Matias Valdenegro
Votre pile n'est probablement pas assez grande pour accueillir un million ints et un million de flotteurs (8MB). Donc dès que vous essayez d'accéder au-delà de la taille de votre tapis, votre système d'exploitation vous jette une erreur. Des objets ou des tableaux au-dessus d'une certaine taille doivent être alloués sur le tas - de préférence à l'aide d'un auto-gestion de l'auto-vérification de limites de classe comme
std::vector
- la taille spécifique dépend de votre mise en œuvre.OriginalL'auteur Puppy
Vous êtes en train de créer géant tableaux sur la pile. Utilisez simplement
std::vector
à la place:OriginalL'auteur Mark B
En plus des débordements de pile, vous avez un autre problème, celui qui est masqué par vos définitions de W et H.
Votre je boucle compter de 0 à H-1, au lieu de W-1 (et la j boucle de swap que de bien). Sinon, votre code ne fonctionnera correctement que si W==H. Si WH vous renversera vos tampons.
Ce même problème existe ailleurs dans l'exemple de code.
OriginalL'auteur mah
Votre pile est pleine. Vous pouvez allouer de la mémoire dans le tas ou à l'augmentation de la pile de la mémoire. À partir de ce que je sais, la taille maximale est d'environ 8 MO, mais ce n'est pas une très bonne idée. La meilleure solution est d'utiliser des tas d'attribution ou de certains conteneurs (vecteur) disponibles en std.
OriginalL'auteur Adrian
Vous finirez par arriver à
Qui est beaucoup plus que vous avez alloué.
i < W
, par conséquent,i
ne peut jamais êtreW
pour obtenirW*W
F - vous avez raison cependant de Bo commentaire révèle encore un bug dans le poster du code, qui est masqué par W == H. Si, au contraire, W = 100, H = 10, le tableau total est de 1000 éléments, mais (i*N+j) = 9909 quand j'==W-1 et j==H-1. Ce problème arrises tout moment de W>H, et ses parce que les boucles sont à l'envers (ou à la sortie de la boucle comme ils le sont, le calcul de l'indice doit changer).
OriginalL'auteur Bo Persson
Votre compilateur va définir la taille de la pile. Un moyen de contourner ce problème est d'allouer dynamiquement de vos tableaux à l'aide de std::vector array_one(W*H).
OriginalL'auteur Adrian Rodriguez
Vous essayez d'allouer de la mémoire de la pile. la mémoire maximum qui peut être allouée à l'aide de la pile est complier dépendante.
Donc, essayez quelque chose comme cela pour éviter ce genre d'exception.
Vous pouvez utiliser aussi bien au lieu d'utiliser malloc pour allouer de la mémoire de tas...
Je pars avec @Massimiliano. Vous n'avez pas besoin de répondre à un déjà accepté question, sauf si vous avez quelque chose de nouveau à proposer.
OriginalL'auteur Anonymous