代码之家  ›  专栏  ›  技术社区  ›  Hassan

得到一个非常恼人的分割错误…在C中mallocing 2d数组

  •  2
  • Hassan  · 技术社区  · 15 年前

    我有点麻烦。首先,这是一个简单的图形库,我正在写。

    我所做的是使声明多个“虚拟屏幕”成为可能,其尺寸由程序员选择。为此,我需要根据屏幕包含的像素数动态分配足够的内存。

    screen_t ). 我实现它的方式是 new_screen 返回的不是指针,而是实际屏幕本身。我在想也许那是个错误。另外,当函数 set_current_screen

    set_current_screen(&screen_variable);
    

    这样做对吗?这就是我打电话的原因吗 新屏幕 ?

    提前谢谢。代码是一个头文件(非常不完整),一个c文件在一个屏幕上绘制一些矩形,尝试生成另一个,得到一个segfault。它们在这里:

    hgl.h

    main.c

    3 回复  |  直到 15 年前
        1
  •  3
  •   Serkan    15 年前

    首先,您的代码在第二个新的\u screen()调用中没有分段。你误导了我们:)代码崩溃,当你试图访问它。你的主要问题在于:

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

    既然您已经分配了指向struct pixel数组的指针,为什么会得到int的大小。您应该将其更改为:

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

    那就一切都好了。但是。。。

    首先可以将位图定义为struct pixel*bitmap; 并为结构分配一个空间 位图=malloc(宽度*高度*大小(结构像素));

    然后可以访问(x,y)处的像素作为位图[y*WIDTH+x]。你也可以在函数中隐藏它。

    另外,你的宽度和高度符号的习惯是相当尴尬的。在后面的循环中,您以通常的方式循环位图数组,但这会导致许多缓存未命中。因为您是按垂直顺序寻址数组。

        2
  •  1
  •   jamesdlin    15 年前

    所以你有:

    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;
    

    但是当你去分配 bitmap 委员会成员 screen_t

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

    你去哪了 unsigned int* 从哪里来? 位图 struct pixel** .

    为避免此类错误,最好:

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

    vscreen.bitmap ,您应该:

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

    (另外,您应该检查 malloc 成功!)

    作为补充,我要说的是,您的分配方案有点不寻常:您是按列分配的,但通常图像是按行存储的。我知道这样做是为了可以使用(x,y)坐标来表示数组下标,但在我看来,最好不要反对矩阵(行,列)约定。

        3
  •  0
  •   pablosaraiva    15 年前

    试试这个:

    结构像素位图[][];