我有一些关于动态分配双数组的问题(在图像处理中)

问题描述 投票:0回答:0

1。双指针(malloc)发生错误:损坏的大小与 prev_size

  • 但是当我在 fclose(f) 之后移动双指针 malloc 部分时,它起作用了。我不知道为什么。

2。动态分配的双数组发生错误:双重释放或损坏

  • 我试过“= NULL;”它不起作用。

所以我用单个数组(B,G,R)实现了代码。
我需要你的帮助。

BmpProcess.h

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

#pragma pack(2)            //The header needs to be 2 byte aligned.
typedef struct                       /**** BMP file header structure ****/
{
    unsigned short bfType;           /* Magic number for file */
    unsigned int   bfSize;           /* Size of file */
    unsigned short bfReserved1;      /* Reserved */
    unsigned short bfReserved2;      /* ... */
    unsigned int   bfOffBits;        /* Offset to bitmap data */
} BITMAPFILEHEADER;
#pragma pack()
typedef struct                       /**** BMP file info structure ****/
{
    unsigned int   biSize;           /* Size of info header */
    int            biWidth;          /* Width of image */
    int            biHeight;         /* Height of image */
    unsigned short biPlanes;         /* Number of color planes */
    unsigned short biBitCount;       /* Number of bits per pixel */
    unsigned int   biCompression;    /* Type of compression to use */
    unsigned int   biSizeImage;      /* Size of image data */
    int            biXPelsPerMeter;  /* X pixels per meter */
    int            biYPelsPerMeter;  /* Y pixels per meter */
    unsigned int   biClrUsed;        /* Number of colors used */
    unsigned int   biClrImportant;   /* Number of important colors */
} BITMAPINFOHEADER;
typedef struct                       /**** Colormap entry structure ****/
{
    unsigned char  rgbBlue;          /* Blue value */
    unsigned char  rgbGreen;         /* Green value */
    unsigned char  rgbRed;           /* Red value */
    unsigned char  rgbReserved;      /* Reserved */
} RGBQUAD;

typedef struct{
    BITMAPFILEHEADER hf;
    BITMAPINFOHEADER hInfo;
    unsigned char * B;
    unsigned char * G;
    unsigned char * R;
    unsigned char ** dB;
    unsigned char ** dG;
    unsigned char ** dR;
    int X0, Y0, X1, Y1 = 0;
    int ImgSize;
    
    void openBMP(const char * filename);
    void writeBMP(const char *filename);
    void freeBGR();
} BMPSTRUCT;

BmpProcess.c

#include "BmpProcess.h"

void BMPSTRUCT::openBMP(const char *filename){
    FILE *f;
    f = fopen(filename, "rb");
    if (f == NULL) return ;
    fread(&hf, sizeof(BITMAPFILEHEADER), 1, f);
    fread(&hInfo, sizeof(BITMAPINFOHEADER), 1, f);
    ImgSize = hInfo.biWidth * hInfo.biHeight;
    X1 = hInfo.biWidth;
    Y1 = hInfo.biHeight;
    
    B = (unsigned char *)malloc(ImgSize);
    G = (unsigned char *)malloc(ImgSize);
    R = (unsigned char *)malloc(ImgSize);
    for (int i = 0; i < ImgSize; i++){
        B[i] = fgetc(f);
        G[i] = fgetc(f);
        R[i] = fgetc(f);
    }
        dB = (unsigned char **)malloc(hInfo.biHeight);
    dG = (unsigned char **)malloc(hInfo.biHeight);
    dR = (unsigned char **)malloc(hInfo.biHeight);
    for (int i = 0 ; i < hInfo.biHeight; i++){
        *(dB+i) = (unsigned char *)malloc(hInfo.biWidth);
        *(dG+i) = (unsigned char *)malloc(hInfo.biWidth);
        *(dR+i) = (unsigned char *)malloc(hInfo.biWidth);
    }
    fclose(f);
}
void BMPSTRUCT::writeBMP(const char *filename){
    FILE *f = NULL;
    f = fopen(filename, "wb"); 
    fwrite(&hf, sizeof(BITMAPFILEHEADER), 1, f);
    fwrite(&hInfo, sizeof(BITMAPINFOHEADER), 1, f);
    for (int i = 0; i < ImgSize + hInfo.biHeight; i++){
        fputc(B[i],f);
        fputc(G[i],f);
        fputc(R[i],f);
    }
    fclose(f);
}

void BMPSTRUCT:: freeBGR(){
    for (int i = 0 ; i < hInfo.biWidth; i++){
        free(dB[i]);
        dB[i] = NULL;
        free(dG[i]);
        dG[i] = NULL;
        free(dR[i]);
        dR[i] = NULL;
    }
    free(dB);
    dB=NULL;
    free(dG);
    dG=NULL;
    free(dR);
    dR=NULL; 
    free(B);
    B=NULL;
    free(G);
    G=NULL;
    free(R);
    R=NULL;
}

复制.c

#include "BmpProcess.c"

int main(){
    BMPSTRUCT bmp;
    bmp.openBMP("sample1.bmp");
    bmp.writeBMP("output.bmp");
    bmp.freeBGR();
    
    return 0;
}
c++ pointers malloc double-pointer double-free
© www.soinside.com 2019 - 2024. All rights reserved.