Ir ao conteúdo
  • Cadastre-se

C Problema com alocação dinâmica, não consigo acessar o espaço reservado


luc14costa

Posts recomendados

Olá, estou começando na área de TI e estou num projeto em que tenho que modificar imagens em ppm. Primeiramente tenho que salvar a imagem em um vetor alocado porém quando tento acessar esse vetor resulta em falha de segmentação, alguém poderia me ajudar? segue aí embaixo o código:

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

typedef struct{
int r,g,b;
} pixel;

pixel *vetor;

int leitura(pixel *vetor, char *codigo, int *coluna, int *linha, int *maximo){

int i;
char nome[20];
printf("Digite o nome do arquivo a ser aberto:\n");
scanf("%s",nome);

FILE *arq;
arq = fopen(nome,"r");
if(arq == NULL){
printf("Erro na abertura do arquivo!\n");
return 0;
} else {

fscanf(arq,"%s",codigo);
fscanf(arq,"%d",coluna);
fscanf(arq,"%d",linha);
fscanf(arq,"%d",maximo);

vetor = malloc(sizeof(pixel)*((*linha**coluna)/3));

for(i=0;i<((*linha**coluna)/3);i++){
fscanf(arq,"%d",&vetor.r);
fscanf(arq,"%d",&vetor.g);
fscanf(arq,"%d",&vetor.b);
}

}

fclose(arq);

return 0;


}

int main(){

int coluna, linha, maximo;
char codigo;

leitura(vetor,&codigo,&coluna,&linha,&maximo);
printf("%d",vetor[1].r); // NESSA PARTE NÃO CONSIGO EXIBIR O VALOR NA TELA OU FAZER QUAISQUER ALTERAÇÃO NO VETOR SALVO;


return 0;
}

Atenciosamente.
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@luc14costa    com algumas modificações ele funciona a primeira parte , onde ele lê no arquivo e imprime as palavras na tela , mas nessa parte do malloc ainda está dando erro .

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

typedef struct{
    int r,g,b;
}pixel;

pixel *vetor;

int leitura(pixel *vetor, char *codigo, int *coluna, int *linha, int *maximo){

    int i;
    char nome[20];
    printf("Digite o nome do arquivo a ser aberto:\n");
    scanf("%s",nome);
    strcat(nome,".txt");
    FILE *arq;
    arq = fopen(nome,"r");
    if(arq == NULL){
        printf("Erro na abertura do arquivo!\n");
        return 0;
    }
    else {
        fscanf(arq,"%s",codigo);
        fscanf(arq,"%d",&coluna);
        fscanf(arq,"%d",&linha);
        fscanf(arq,"%d",&maximo);
        printf("%s %d %d %d",codigo,coluna,linha,maximo);getch();
        vetor = malloc(sizeof(pixel)*((*linha**coluna)/3));
        
        for(i=0;i<((*linha**coluna)/3);i++){
            fscanf(arq,"%d",&vetor->r);
            fscanf(arq,"%d",&vetor->g);
            fscanf(arq,"%d",&vetor->b);
        }

    }
    fclose(arq);
    return 0;
}

int main(){
    int coluna, linha, maximo;
    char codigo;

    leitura(vetor,&codigo,&coluna,&linha,&maximo);
    printf("%d",vetor[1].r); /*// NESSA PARTE NÃO CONSIGO EXIBIR O VALOR NA TELA OU FAZER QUAISQUER ALTERAÇÃO NO VETOR SALVO;*/

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Tente:    vetor =  (pixel*)malloc(sizeof(pixel)*((linha*coluna)/3));//

 

Acho que não precisa dividir por 3, já que é vetor e você quer "esticar" a matriz. Enfim, deve multiplicar linha*coluna = total de elementos, sendo que precisa ser do tamanho do objeto pixel, por isso: sizeof(pixel)*x

 

Link para o comentário
Compartilhar em outros sites

@luc14costa Não lembro o porquê, mas para alocar um vetor dinâmico de struct, tem que passar o "ponteiro do ponteiro" como parâmetro da função. Utilize o exemplo abaixo como base para alocar seu vetor dinâmico de struct.

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

struct rgb
{
    int r, g, b;
};

void aloca(struct rgb **p, int n)
{
    *p = (struct rgb*) malloc(n * sizeof(struct rgb));
}

int main()
{
    struct rgb *ptr;
    int i, tam = 100;

    aloca(&ptr, tam);

    for ( i = 0; i < tam; i++)
    {
        ptr[i].r = i;
        ptr[i].g = i;
        ptr[i].b = i;
    }

    for ( i = 0; i < tam; i++)
    {
        printf("\n V[%d].", i+1);
        printf("\n");
        printf("\n R: %d", ptr[i].r);
        printf("\n G: %d", ptr[i].g);
        printf("\n B: %d", ptr[i].b);
        printf("\n ----------------------------");
    }

    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...