Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        4年前关闭。
                                                                                            
                
        
使用结构变量和结构数组读取bmp图像的代码。
请建议我正确的方法对malloc进行类型转换(以下代码中列出的错误):

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

typedef struct bands{
/* .bmp image store pixel colors in "bgr" sequence */
unsigned char b,g,r; //in 24bit bmp, we need to use 8bit datatype for each color
}bands;

int main()
{
FILE *bmpimage; //ptr to read image file
FILE *redpix,*greenpix,*bluepix; //ptr to create band/color wise file
unsigned short pix_x=223,pix_y=197; /*pix_x: no. of pixels in a row,   pix_y: no. of pixels in a column of input image*/
unsigned short n_pix=pix_x*pix_y;   /*variable to count total no. of  pixels*/

bmpimage=fopen("blocks223x197.bmp","r"); //24 bit bmpimage
redpix=fopen("redpixels.txt","w");
greenpix=fopen("greenpixels.txt","w");
bluepix=fopen("bluepixels.txt","w");

/*  Define a pointer to a memory block,'*readbuffer',
that has 'n_pix' no. of memory blocks each of size same as struct bands */
bands *readbuffer=(char*)malloc(n_pix*sizeof(*readbuffer));

int n;
//Create memory for each of 'n_pix' no. of pixel array of each color
for(n=0;n<n_pix;n++){
    unsigned char *readbuffer[n].b =  (char*) malloc(sizeof(readbuffer[n].b));
    unsigned char *readbuffer[n].g = (char*) malloc(sizeof(readbuffer[n].g));
    unsigned char *readbuffer[n].r = (char*) malloc(sizeof(readbuffer[n].r));
}

if(!bmpimage){printf("Error reading bmpimage!");return 1;}
if(readbuffer==NULL){printf("NULL buffer"); exit(1);}

/* Go to 54th byte to access pixelvalue data (since, 24bit bmp format) */
fseek(bmpimage,54,SEEK_SET);

/* Read 'n_pix' no. of 'bgr' blocks each of which are of the size same as "struct bands" */
fread(readbuffer,sizeof(bands),n_pix,bmpimage);  /*read 'n_pix' no. of 'bgr' blocks each of which are of the size same as "struct bands" to the memory address, 'readbuffer' or '&readbuffer[0]' */

int n_blocks=(sizeof(readbuffer)/sizeof(bands));
printf("no. of blocks read= %d, n_pix=%d",n_blocks,n_pix);


int i,j; int count; count=0;
/* logic to print pixel values in correct order*/

for(i=pix_y;i>0;i--){   /*for accessing row data. Choose to print from bottom to top*/
 for(j=1;j<=pix_x;j++){ /*for accessing column data. Print from left to right*/

    if(j!=pix_x){
    fprintf(redpix,"%d,",readbuffer[(i-1)*pix_x + j].r);
    fprintf(greenpix,"%d,",readbuffer[(i-1)*pix_x + j].g);
    fprintf(bluepix,"%d,",readbuffer[(i-1)*pix_x + j].b);
    }
    else{
        count++;
    fprintf(redpix,"%d\n",readbuffer[(i-1)*pix_x + j].r);
    fprintf(greenpix,"%d\n",readbuffer[(i-1)*pix_x + j].g);
    fprintf(bluepix,"%d\n",readbuffer[(i-1)*pix_x + j].b);
    }
  }
}

// free allocated memory
for(n=0;n<n_pix;n++){
    free(readbuffer[n].b) ;
    free(readbuffer[n].g) ;
    free(readbuffer[n].r) ;
}


fclose(bmpimage);fclose(redpix);fclose(bluepix);fclose(greenpix);

return 0;

}


参考文献:
How to properly malloc for array of struct in C

malloc an array of struct pointers vs array of structs

错误清单:


  bmpread_check.c:在“ main”函数中:
  bmpread_check.c:24:19:警告:通过不兼容的指针类型进行初始化> [默认启用]
  频段readbuffer =(char)malloc(n_pix * sizeof(* readbuffer));
                     ^
  bmpread_check.c:29:33:错误:预期为'=',',',';','asm'或'attribute'>“之前”。代币
    unsigned char readbuffer [n] .b =(char)malloc(sizeof(readbuffer [n] .b));
                                   ^
  bmpread_check.c:29:33:错误:“。”之前的预期表达式。代币
  bmpread_check.c:30:33:错误:预期为'=',',',';','asm'或'attribute'>“之前”。代币
      unsigned char readbuffer [n] .g =(char)malloc(sizeof(readbuffer [n] .g));
                                   ^
  bmpread_check.c:30:33:错误:“。”之前的预期表达式。代币
  bmpread_check.c:31:33:错误:预期为'=',',',';','asm'或'attribute'>“之前”。代币
  unsigned char readbuffer [n] .r =(char)malloc(sizeof(readbuffer [n] .r));;
                                   ^
  bmpread_check.c:31:33:错误:“。”之前的预期表达式。代币
  bmpread_check.c:69:5:警告:传递'free'参数1会使> integer指针不进行强制转换[默认启用]
      free(readbuffer [n] .b);
       ^
  在bmpread_check.c:3:0包含的文件中:
  c:\ mingw \ include \ stdlib.h:357:38:注意:预期为'void',但参数的类型为'unsigned char'
  _CRTIMP void __cdecl __MINGW_NOTHROW free(void);
                                        ^
  bmpread_check.c:70:5:警告:传递“ free”参数1使> integer指针不进行强制转换[默认启用]
      free(readbuffer [n] .g);
       ^
  在bmpread_check.c:3:0包含的文件中:
  c:\ mingw \ include \ stdlib.h:357:38:注意:预期为'void',但参数的类型为'unsigned char'_CRTIMP void __cdecl __MINGW_NOTHROW free(void);
                                        ^
  bmpread_check.c:71:5:警告:传递'free'参数1会使> integer指针不进行强制转换[默认启用]
      free(readbuffer [n] .r);
       ^
  在bmpread_check.c:3:0包含的文件中:
  c:\ mingw \ include \ stdlib.h:357:38:注意:预期为'void',但参数类型为'unsigned char'
  _CRTIMP void __cdecl __MINGW_NOTHROW free(void);
                                        ^

最佳答案

这个:

bands *readbuffer=(bands*)malloc(n_pix*sizeof(bands));


(注意:不是*readbuffer。它是bands

已经为所有n_pix频段分配了内存。

不需要为b, g, r分配内存,因为它们不是指针。

所以,

//Create memory for each of 'n_pix' no. of pixel array of each color
// And allocating using for loop


不需要。

10-08 11:31