Re: Alocação dinâmica...
Raphael DephiNit Pereira wrote:
> 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.
>
Estah ocorrendo falha de segmentação por que o programa está invadindo espaço de
memória não alocada para ele ou o stack. Quando você declarou a variável em outra
posição simplesmente houve uma mudança na ordem em que estas variáveis foram
alocadas no stack (são automáticas e portanto alocadas em stack) e o programa
alterou apenas o espaço reservado a ele para o stack. Sempre que uma função /
aplicativo der pau pela simples reordenação na declaração de variáveis, fique
esperto! Revise de imediato o código fonte. As vezes ocorrem coisas estranhas num
programa e que parecem aleatorias, mas muitas vezes tem a ver com ponteiros nao
inicializados, ou inicializados erradamente. Em C, todo cuidado com ponteiro _eh_
pouco. Na duvida, gere o codigo em assembler e veja como o compilador trata suas
declaraçoes e manipula as variaveis.
Vinicius
Reply to: