Segmentation fault maldita! [RESOLVIDO]

1. Segmentation fault maldita! [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/09/2016 - 21:27h

Pessoal, não consigo compreender por que está dando Segmentation fault :(
Sei que existem maneiras alternativas e até mais fáceis de fazer isso (é o que todos dizem), mas gostaria de saber o porquê do meu código estar dando erro. Agradecido desde já! :-D


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

typedef int** Matriz;


void criarMatriz(Matriz *A, int linhas, int colunas){
int i;
*A = malloc(linhas*sizeof(Vetor));
for(i=0;i<linhas;i++){
*A[i]=malloc(colunas*sizeof(int));
}
}

void escreverNaMatriz(Matriz A, int linhas, int colunas){
int i,j;
for(i=0;i<linhas;i++){
for(j=0;j<colunas;j++){
A[i][j]=rand()%2;
}
}
}

void escreverMatriz(Matriz A, int linhas, int colunas){
int i,j;
for(i=0;i<linhas;i++){
for(j=0;j<colunas;j++){
printf("%d ",A[i][j]);
}
printf("\n");
}
}

int main(){
Matriz A;
criarMatriz(&A,10,10);
escreverNaMatriz(A,10,10);
escreverMatriz(A,10,10);
return 0;
}



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/09/2016 - 22:30h

sjmsimionicosta escreveu:

Pessoal, não consigo compreender por que está dando Segmentation fault :(
Sei que existem maneiras alternativas e até mais fáceis de fazer isso (é o que todos dizem), mas gostaria de saber o porquê do meu código estar dando erro. Agradecido desde já! :-D

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

typedef int** Matriz;


void criarMatriz(Matriz *A, int linhas, int colunas){
int i;
*A = malloc(linhas*sizeof(Vetor));


Quem é Vetor? Não vi esse símbolo em lugar nenhum no programa além daqui. E como você pode saber o tamanho de algo que não está declarado?

Uma forma de você não errar nunca é forçar o compilador a calcular o tamanho para você, usando a seguinte construção.

ptrX=malloc(n_elementos * sizeof *ptrX) 


No seu caso, “ptrX” é igual a “*A” e “n_elementos” é o papel de “linhas”, de modo que você pode escrever o seguinte.

*A=malloc(linhas * sizeof **A); 


	for(i=0;i<linhas;i++){
*A[i]=malloc(colunas*sizeof(int));


A mesma coisa pode ser feita aqui, mas antes você precisa corrigir um problema. A expressão “*A[i]” significa “conteúdo do endereço indicado pelo elemento com índice i do array A”, mas você certamente quis dizer “o elemento com índice i do array indicado pelo conteúdo do ponteiro A”. Como o operador de indexação de array (colchetes) têm precedência maior do que o operador de derreferência (asterisco), você é obrigado a usar parênteses para obter o segundo significado.

Veja como fica (“ptrX” igual a “(*A)[i]” e “n_elementos” igual a “colunas”):

(*A)[i]=malloc(colunas * sizeof *(*A)[i]); 


Como o tamanho do elemento não depende de sua posição no array (uma vez que todos os elementos de um array são do mesmo tipo), você pode simplificar a construção acima mais um pouco.

(*A)[i]=malloc(colunas * sizeof ***A); 


	}
}

void escreverNaMatriz(Matriz A, int linhas, int colunas){
int i,j;
for(i=0;i<linhas;i++){
for(j=0;j<colunas;j++){
A[i][j]=rand()%2;


Informação de cautela: implementações históricas de rand() usavam um algoritmo numa forma tal que os valores aleatórios produziam uma sequência alternada de valores pares e ímpares. Como vários sistemas AINDA USAM esse gerador fraquinho de números pseudoaleatórios (não é o caso do Linux com versões mais novas da glibc -- embora você possa forçá-lo a tanto, se quiser --, mas o é em versões mais antigas da glibc e em vários outros sabores de Unix, e talvez seja também no Windows), se você quiser garantir que os números sorteados terão um grau de aleatoriedade mais alto, seria melhor usar a seguinte forma.

A[i][j]=floor(0.5+(double)rand()/(double)RAND_MAX); 


		}
}
}

void escreverMatriz(Matriz A, int linhas, int colunas){
int i,j;
for(i=0;i<linhas;i++){
for(j=0;j<colunas;j++){
printf("%d ",A[i][j]);
}
printf("\n");
}
}

int main(){
Matriz A;
criarMatriz(&A,10,10);
escreverNaMatriz(A,10,10);
escreverMatriz(A,10,10);
return 0;
}


3. Muito Obrigado!

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/09/2016 - 22:53h

Essa comunidade é tudo de bom e mais um pouco!!!
Obrigado pela resposta, amigo! Sua dedicação é apreciável :-)


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

typedef int* Vetor;
typedef int** Matriz;

void criarMatriz(Matriz *A, int linhas, int colunas){
int i;
*A = malloc(linhas*sizeof(Vetor));
for(i=0;i<linhas;i++){
(*A)[i]=malloc(colunas*sizeof(int)); //O maldito erro estava aqui!
}
}

void escreverNaMatriz(Matriz A, int linhas, int colunas){
int i,j;
for(i=0;i<linhas;i++){
for(j=0;j<colunas;j++){
A[i][j]=rand()%2;
}
}
}

void escreverMatriz(Matriz A, int linhas, int colunas){
int i,j;
for(i=0;i<linhas;i++){
for(j=0;j<colunas;j++){
printf("%d ",A[i][j]);
}
printf("\n");
}
}




int main(){
Matriz A;
criarMatriz(&A,10,10);
escreverNaMatriz(A,10,10);
escreverMatriz(A,10,10);
return 0;
}




4. Re: Segmentation fault maldita! [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/09/2016 - 23:30h

Só mais uma coisa: tem um programa chamado gdb que serve para procurar certos problemas dos programas em tempo de execução. Depurador de erros, mesmo.

Pode ser uma boa tomar contato com ele.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts