Error Read access violation in visual studio function

Asked

Viewed 127 times

1

Good morning, I have a project to do, it is almost done, but now I have created two functions that give me reading access violation error, and I am not able to solve the problem, someone can help? inserir a descrição da imagem aqui

this is one of the functions that gives this error:

void imag_com_mais_blobs(BLOBS *b)
{
IMAGEM *im;
im = (IMAGEM *)malloc(sizeof(IMAGEM));
int max_blobs;
char im_mais_blobs[30];
max_blobs = 0;
//determinar imagem com mais blobs
if (b->npixeis>max_blobs)
{
    max_blobs = b->npixeis;
    strcpy(im_mais_blobs, im->nome_imagem);
    printf("A imagem com mais blobs é %s", im_mais_blobs);
}
}

this function is called in another function, but I believe that there it is all right:

int LerFicheiro(char *fi, LISTAIMG *LImag,int R,int G,int B,int d) // fi é variável para o nome do ficheiro
 {
int i, j, nC, nL, ncanais;
FILE *f;
PIXEL *p;
PIXEL **m;
IMAGEM *Imag;
BLOBS *b;
b = (BLOBS *)malloc(sizeof(BLOBS));
//Imag = (IMAGEM *)malloc(sizeof(IMAGEM));
p = (PIXEL *)malloc(sizeof(PIXEL));
f = fopen(fi, "r");  // abre um ficheiro qualquer
if (f == NULL) return NULL;
while (!feof(f))
{
    system("cls");
    printf("A analisar imagem\n");
    //fread(&nome, sizeof(IMAGEM), 1, f);  // nome da imagem
    //fread(&Imag->NLINHAS, sizeof(IMAGEM), 1, f); //  nº linhas
    //fread(&Imag->NCOLUNAS, sizeof(IMAGEM), 1, f);  // nº colunas
    //fread(&Imag->NCANAIS, sizeof(IMAGEM), 1, f);  // nº canais
    Imag = criar_imagem();
    fscanf(f,"%s", &Imag->nome_imagem);
    if (feof(f))
    {
        free(Imag);
        break;
    }
    fscanf(f, "%d", &Imag->NLINHAS);
    fscanf(f, "%d", &Imag->NCOLUNAS);
    fscanf(f, "%d", &Imag->NCANAIS);



    if (Imag->NCANAIS != 3) // caso o nº de canais que conste no ficheiro seja diferente de 3,  fecha o ficheiro. 
    {
        fclose(f);
        printf(" número de canais incorreto!!!");
        return NULL;
    } 
    Imag->pixels= criarmatriz(Imag->NLINHAS, Imag->NCOLUNAS);
    for (i = 0; i < Imag->NLINHAS; i++)
    {
        for (j = 0; j < Imag->NCOLUNAS; j++)
        {
            fscanf(f, "%d", &Imag->pixels[i][j].R);
            fscanf(f, "%d", &Imag->pixels[i][j].G);
            fscanf(f, "%d", &Imag->pixels[i][j].B);
            //fread(&m[i][j].R, sizeof(IMAGEM), 1, f);
            //fread(&m[i][j].G, sizeof(IMAGEM), 1, f);
            //fread(&m[i][j].B, sizeof(IMAGEM), 1, f);
            Imag->pixels[i][j].visitado = 0;

        }

    }

    imag_com_mais_blobs(b);

}
fclose(f);
return INSUCESSO;

}

structure BLOBS:

typedef struct blobs    //pilha
{
int linha, coluna;
struct elementozona *inicio;
struct blobs *proximo;
float mediaR, mediaG, mediaB, desv_padraoR, desv_padraoG, desv_padraoB;
int npixeis;
}*ptBLOBS, BLOBS;

1 answer

0

Start here: you have allocated memory for the "im" pointer in (1), used the "im" pointer in (2), but you have not initialized the memory allocated in (1). Great chances of "strcpy" in (2) exiting overwriting memory.

void imag_com_mais_blobs(BLOBS *b)
{
  IMAGEM *im = (IMAGEM*)malloc(sizeof(IMAGEM)); // <-------------- (1) MEMORIA NAO INICIALIZADA
  int max_blobs = 0;
  char im_mais_blobs[30];

  //determinar imagem com mais blobs

  if (b->npixeis > max_blobs)
  {
    max_blobs = b->npixeis;
    strcpy(im_mais_blobs, im->nome_imagem); // <----------- (2) MEMORIA NAO INICIALIZADA
    printf("A imagem com mais blobs é %s", im_mais_blobs);
  }
}
  • Keeps making the same mistake, same place :/

  • update your question with the correction you made

  • Now that I’m noticing, I put the code you sent me, but it’s just like the one I had before :)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.