2016-12-02 17 views
-3

私はこのコードを持っている:2次元ポインタ構造体をmalloc、calloc、reallocする方法は?

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
    int i,j,width,height,operatie; 
    struct pixel { 
     unsigned char r, g, b; 
    } ; 
    struct pixel **poza; 
    scanf("%d",&operatie); 
    scanf("%d",&width); 
    scanf("%d",&height); 
    poza = malloc (height * width * sizeof(pixel)); 
    for (i=0 ; i<height ; i++) { 
     for (j=0 ; j<width ; j++) { 
      scanf("%c",&(poza[i][j].r)); 
      scanf("%c",&(poza[i][j].g)); 
      scanf("%c",&(poza[i][j].b)); 
     } 
    } 
    for (i=0 ; i<height ; i++) { 
     for (j=0 ; j<width ; j++) { 
      printf("%d ",(poza[i][j].r)); 
      printf("%d ",(poza[i][j].g)); 
      printf("%d ",(poza[i][j].b)); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

は、私はこの上malloccallocreallocを使用する方法を知りたいです。 可能であれば、どのように動作するか説明してください。そこ

+0

poza = malloc(高さ*幅* sizeof(ピクセル)); '---->' poza = malloc(高さ*幅* sizeof(構造体ピクセル)); ' – LPs

答えて

1

多くの問題:

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

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

int main(void) 
{ 
    int i,j,width,height,operatie; 

    struct pixel *poza; 
    struct pixel *temp; 

    scanf("%d",&operatie); 
    scanf("%d",&width); 
    scanf("%d",&height); 

    poza = malloc (height * width * sizeof(struct pixel)); 

    if (poza != NULL) 
    { 
     for (i=0 ; i<height ; i++) 
     { 
      temp = &poza[i*height]; 

      for (j=0 ; j<width ; j++) 
      { 
       scanf("%d",&(temp[j].r)); 
       scanf("%d",&(temp[j].g)); 
       scanf("%d",&(temp[j].b)); 
      } 
     } 

     for (i=0 ; i<height ; i++) 
     { 
      temp = &poza[i*height]; 

      for (j=0 ; j<width ; j++) 
      { 
       printf("%d ",(temp[j].r)); 
       printf("%d ",(temp[j].g)); 
       printf("%d ",(temp[j].b)); 
      } 
      printf("\n"); 
     } 
    } 

    free(poza); 

    return 0; 
} 
  1. pixelsizeof(pixel)sizeof(struct pixel)
  2. でなければならないので、構造体であり、Iはから変換保存するために確保する(r, g, bタイプおよび構造体ピクセル)にscanf関数のフォーマット指定を変更アスキー値。 %cを使用すると、入力データのASCII値が格納されており、'\n'の文字に問題があります。
  3. pozaのタイプを単純なポインタを使用するように変更しました。ポインターのポインタを使用しないでください。そのようにして、メモリを断片化します。
  4. ご覧のとおり、私は一時変数を使用してコードを読みやすくしました(私の個人的意見)。示された方法では、あなたの配列への "行"の正しい変位を指し、 "cols"をループすることができます。
関連する問題