2015-03-02 76 views
1

我正在努力爲XPM圖像分配內存。
我已經建立了我自己的圖書館具有以下功能:XPM圖像內存分配

XPM* initXPM (

    unsigned int width, 
    unsigned int height, 
    unsigned int cpp, 
    unsigned int ncolors) 
{ 
    XPM *image; 
    image=(XPM*)malloc(sizeof(Color*) * (width * height) * cpp); 
    (*image).colta = (Color*) malloc(ncolors * sizeof(Color)); 
    (*image).width = width; 
    (*image).height = height; 
    (*image).cpp = cpp; 
    (*image).ncolors = ncolors; 

    int i; 
    for (i = 0; i < ncolors; i++) 
    { 
     (*image).colta[i].pchars = (char*) malloc((cpp + 1) * sizeof(char)); 
    } 

    (*image).data = (unsigned int**)malloc(height * sizeof(unsigned int*)); 
    for (i = 0; i < height; i++) 
    { 
     (*image).data[i] = (unsigned int*) malloc(width * sizeof(unsigned int)); 
    } 

    printf("init :height : %d , width :%d ncolors:%d , cpp : %d\n",(*image).height,(*image).width,(*image).ncolors,(*image).cpp); 
    return image; 
} 

的XPM結構如下:

typedef struct 
{ 
    unsigned int r,g,b; /* the red, green and blue components */ 
    char *pchars; /* pointer to the character(s) combination */ 
} Color; 

/* the number of characters for one color is contained into the XPM structure */ 

typedef struct 
{ 
    unsigned int width; /* width in pixels */ 
    unsigned int height; 
    unsigned int cpp; /* number of characters per pixel */ 
    unsigned int ncolors; /* how many colors we'll be using */ 
    Color *colta; /* colors array */ 
    unsigned int **data; /* the area that contains the image, */ 
    /* width x height locations for */ 
    /* indices into colta */ 
} XPM; 

我打電話這樣的初始化函數:

XPM *image; 

    image = initXPM(200,200,1,2); 

我已成功初始化XPM文件的值爲:(50,50,2,50)。如果我嘗試用200而不是初始化文件它崩潰。
我想創建一個200x200 XPM文件,但它會中斷。使用電籬笆我發現它在我設置圖像寬度時崩潰。
我應該如何分配內存以便能夠像這樣使用它?
我試圖修改一下這個結構,如果我在我的主要方法中靜態聲明結構並將XPM圖像的地址發送到init函數,它會起作用,但我希望能夠像庫一樣使用它。

+0

'(* image).colta' - *** nooooo!***只要執行'image-> colta'。並且[不要強制轉換'malloc()']的返回值(https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858)。 – 2015-03-02 19:09:12

+0

我試過'image->'而不是'(* image).'但是結果是一樣的 – 2015-03-02 19:10:20

+1

'image =(XPM *)malloc(sizeof(Color *)*(width * height)* cpp )'是非常可疑的,因爲你沒有在其中的任何地方使用'sizeof(XPM)'。 – 2015-03-02 19:10:42

回答

0
image=(XPM*)malloc(sizeof(Color*) * (width * height) * cpp); 

顯然是錯誤的,但因爲這分配爲所有,但最小的圖像太多的內存,它不能引起你提到的崩潰。儘管如此

  • image = malloc(sizeof *image);將是一個正確的分配

  • initXPM(200, 200, 2, 50);並不在我的系統崩潰

  • 你應該使用一個調試器(如gdb),而不是efence來分析這個問題。