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

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: