簡體   English   中英

得到一個非常煩人的分割錯誤……在C中分配2d數組

[英]Getting a very annoying segmentation fault… mallocing 2d array in C

我對此有點麻煩。 首先,這是針對我正在編寫的簡單圖形庫。

我正在做的事情是可以聲明多個“虛擬屏幕”,程序員可以選擇尺寸。 為此,我需要根據屏幕將包含的像素數量動態分配足夠的內存。

分配此內存的函數在我的程序中似乎只工作一次,然后每當我再次調用它時(出現段錯誤)就會失敗。 我認為問題可能是我繞過虛擬屏幕( screen_t )的方式。 我實現它的方式是,函數new_screen不返回指針,而是返回實際的屏幕本身。 我在想也許那是一個錯誤。 此外,當一個函數(例如set_current_screen需要一個屏幕作為其參數之一時,它會傳遞地址,如下所示:

set_current_screen(&screen_variable);

這是正確的方法嗎? 當我調用new_screen時,這是導致段錯誤的new_screen嗎?

提前致謝。 該代碼是一個頭文件(非常不完整),一個ac文件在一個屏幕上繪制一些矩形,試圖制作另一個,得到段錯誤。 他們來了:

hgl.h

main.c中

首先,在第二個new_screen()調用中,您的代碼不是SEGFAULT。 您會誤導我們所有人:)嘗試訪問時代碼崩潰。 您的主要問題在於此行:

 47     vscreen.bitmap[i] = malloc(height * sizeof(int));

由於您已經分配了一個指向結構像素數組的指針,因此為什么要獲取一個int的大小。 您應該將其更改為以下內容:

vscreen.bitmap[i] = malloc(height * sizeof(struct pixel));

那一切應該沒問題。 但...

..代碼中還有許多其他問題。 在new_screen中,您要分配一個指針數組,然后分別分配每一行。 為什么不立即分配整個屏幕?

首先,您可以將位圖定義為struct pixel * bitmap; 並為該結構分配一個空間,如下:bitmap = malloc(width * height * sizeof(struct pixel));

然后,您可以將(x,y)處的像素作為位圖[y * WIDTH + x]。 您也可以將其隱藏在函數中。

另外,您的寬度和高度符號慣例很尷尬。 在后面的循環中,您將以通常的方式循環位圖數組,但這會導致許多高速緩存未命中。 由於您要按垂直順序尋址數組。

另一點是關於循環的使用。 您知道,有一個循環:用於。 在您的情況下在代碼中使用它更有意義。

所以你有了:

typedef struct pixel{
    unsigned char b;
    unsigned char g;
    unsigned char r;
    float a;
};

struct virtual_screen{
    int layer;
    int width;
    int height;
    int opacity;
    struct pixel **bitmap;
};

typedef struct virtual_screen screen_t;

但是,當您分配screen_tbitmap成員時,您會執行以下操作:

vscreen.bitmap=malloc(width * sizeof(unsigned int *));

unsigned int*來自哪里? bitmap的類型為struct pixel**

為避免此類錯誤,最好執行以下操作:

vscreen.bitmap=malloc(width * sizeof *vscreen.bitmap);

同樣,當分配vscreen.bitmap的元素時,您應該執行以下操作:

vscreen.bitmap[i] = malloc(height * sizeof *vscreen.bitmap[i]);

(此外,您應該檢查malloc成功!)

附帶說明一下,我會說您的分配方案有點不尋常:您按列分配,但通常圖像按行存儲。 我知道您正在執行此操作,因此可以為數組下標使用(x,y)坐標,但是IMO最好不要與矩陣(行,列)約定打架。

問題出在virtual_screen結構的位圖聲明。

嘗試這個:

struct pixel bitmap [] [];

然后,更正可能受此更改影響的代碼部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM