C - Malloc() va in stack overflow

di il
6 risposte

C - Malloc() va in stack overflow

Ciao a tutti,

voglio creare una griglia editabile inserendo numero di righe e colonne a scelta dell'utente, ma succede questo:
- se inserisco un numero di righe pari a 1 o 2 il programma funziona correttamente
- se inserisco un numero > 3 il processo va in crash restituendo return value 3221225725 che mi sono informato essere uno stack overflow.

Mi sto scervellando da giorni ma non riesco a trovare una quadra, posto il codice sperando possiate darmi una dritta

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>


#define dim 10 
#define P1_num_navi 4 
#define P2_num_navi 4

int **grigliaP1;
int **grigliaP2;
int i,j,t,a;//variabili globali
int righe, colonne, r, c,contnum_naviP1;//variabili P1
int righex,colonnex,rx,cx,contnum_naviP2; //variabiliP2



void InizializzaGrigliaP1()
{
   grigliaP1 = (int **) malloc (righe*sizeof(int*));
     
   for(r=0; r<righe; r++)

     grigliaP1[r] = (int *) malloc(righe*sizeof(int*));
     
     
 }
 
void InizializzaGrigliaP2()
{

   grigliaP2 = (int **) malloc (righex*sizeof(int *));

   for(rx=0; rx<righex; rx++)

     grigliaP2[rx] = (int *) malloc(colonnex*sizeof(int));
     
 }




main()

{

InizializzaGrigliaP1();
InizializzaGrigliaP2();


 //Definizione campo
  int num_navip1;

int contnum_navip1 = 0;

   printf("Preparazione campo... \n\n");

  
  printf(" righe");
scanf("%d %d", &righe, &righex);
printf("\n");
printf("colonne");
scanf("%d %d", &colonne,&colonnex);
printf("\n");
 

do{


printf("P1: Inserisci una nave \n 0: posto libero \n 1: collocare la nave \n");

   for(r=0; r<righe; r++)
     {
	 
     for(c=0; c<colonne; c++)

     {
       printf("Inserisci elemento di riga %d e colonna %d: ",r,c);
       scanf("%d",&grigliaP1[r][c]);
    
       if (grigliaP1[r][c]==1)
                {
                printf("nave inserita!\n");
                contnum_naviP1++;
                printf("restano da inserire %d navi!\n", P1_num_navi-contnum_naviP1);
               }
 
             }
    }
     
}

		 
while(1);

system("pause");
}
[\code]

6 Risposte

  • Re: C - Malloc() va in stack overflow

    Ma scusa: hai delle variabili globali e non dichiari le griglie come variabili globali? Ma che senso ha?
    
    #define DIM_GRIGLIA_MAX 10
    int grigliaP1[DIM_GRIGLIA_MAX][DIM_GRIGLIA_MAX];
    int grigliaP2[DIM_GRIGLIA_MAX][DIM_GRIGLIA_MAX];
    
    Lascia perdere l'allocazione dinamica - la riprenderai dopo quando avrai più chiari i concetti di base, ad esempio dopo aver capito cosa significa sizeof(int*).

    ... anzi, griglie e scacchiere possono pure restare come variabili globali anche in un programma avanzato
  • Re: C - Malloc() va in stack overflow

    Sono passato all'allocazione dinamica perchè mi ha risolto diversi problemi, ed il #define dim 10 è uno scarto dell'architettura precedente

    Riprovo con le variabili globali, ma secondo te come mai si blocca dopo un certo input?
  • Re: C - Malloc() va in stack overflow

    A parte che usi righe anche nella malloc del ciclo in P1, hai idea di quanto valgano righe colonne quando le usi?
  • Re: C - Malloc() va in stack overflow

    @oregon in senso di byte o di input? Nella malloc del ciclo in P1 uso righe (nel ciclo P2 è righex) per definire l'array della grandezza dell'input... ragionamento sbagliato?

    Tornando alle variabili globali il problema non si presenta e ringrazio Weierstrass, probabilmente prima commettevo altri errori; ma volevo comunque capire perchè il ciclo andava in stack overflow pro futuro..
  • Re: C - Malloc() va in stack overflow

    Ti ha già detto oregon che hai una variabile errata in InizializzaGrigliaP1() e che chiami InizializzaGrigliaP1() e InizializzaGrigliaP2() prima di acquisire righe e colonne da terminale, cioè quando righe e colonne sono a zero (le variabili globali vengono inizializzate a zero se non indicato diversamente)
  • Re: C - Malloc() va in stack overflow

    Controlla

    GrigliaP1[r] = (int *) malloc(righe*sizeof(int*));

    e assegna dei valori a righe e colonne PRIMA di usarli altrimenti sono a zero
Devi accedere o registrarti per scrivere nel forum
6 risposte