[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Alocaçãodinâmica...



Olá pessoal!

Eu estou fazendo um programa (em C) que tem como entrada uma matriz de 
tamanho variável, dada pelo usuário.
Para gerar essa matriz, eu criei a seguinte função:

void gera_matriz(float **matriz, int i, int j)
{
        int contador;
 
        /* Primeiro eu crio um bloco com `i' ponteiros */
        if (!(*matriz = (float *) malloc((i * (sizeof(float *))))))
        {
                printf("Não há memória suficiente");
                exit(-1);
        }
 
        /* Agora crio `i' blocos com `j' floats */
        for (contador = 0; contador < i; contador++)
        {
                if (!(matriz[contador] = (float *) malloc((j * 
(sizeof(float))))))
                {
                        printf("Não há memória suficiente");
                        exit(-1);
                }
        }
}

E no meu main() eu declaro as seguintes variáveis:

int main(void)
{
        int contai, contaj, pivo;
        int i, j, jaument;
        int operador;
        float **matriz;
	
	...
        gera_matriz(matriz, i, jaument);
	...
}

Quando eu compilo e rodo o programa, ele dá "Segmentation fault". Então, 
depois de muito quebrar a cabeça, eu comecei a tentar coisas absurdas e uma 
delas funcionou:

int main(void)
{
        float **matriz;
        int contai, contaj, pivo;
        int i, j, jaument;
        int operador;
 	
	...
        gera_matriz(matriz, i, jaument);
	...
}

Não viram diferença? Olhem a posição da declaração do "float **matriz;". Isso 
deixou o meu programa funcionando! Agora eu pergunto: isto é normal? É uma 
regra que eu não sei (Já que aprendi a programar sozinho)? Esqueci de algo na 
linha de comando do gcc ( que foi "gcc -Wall -o gauss-jordan 
gauss-jordan.c")? É um bug? 

Desculpem a pergunta meio off-topic.

-- 
Raphael "DephiNit" Pereira
        -=-*-=-*-=-
  dephinit@softhome.net
        -=-*-=-*-=-



Reply to: