为另一个结构内的结构数组分配内存

时间:2014-02-27 12:18:09

标签: c pointers structure

我真的不知道这里的问题是什么。编译器说它没关系,但是当我运行它时,可执行文件崩溃了(我相信这是一个分段错误问题)。他们说两个人总是比一个人好,所以我希望你们能找到我错过的任何东西。

好的,所以就是这样:我有2个结构:

struct _Color {

    unsigned char r,g,b;
    char *pchars;
}; //typedef to Color in header file

struct _XPM {

    unsigned int width;
    unsigned int height;
    unsigned char cpp; 
    unsigned int ncolors;
    Color *colta; //collor table
    unsigned int *data[];

}; //typedef to XPM in header file

然后,在一个函数中,我为XPM结构分配内存,然后为XPM结构中的Color数组分配(我不会在这里编写故障安全代码):

XPM *imagine; //received as a parameter
imagine = ( XPM* ) malloc ( sizeof ( XPM ) + sizeof ( unsigned int* ) * width );
imagine -> colta = malloc ( ncolors * sizeof ( imagine -> colta ) ); 
/*I tried with both *imagine ->colta and imagine -> colta just to be safe */

当我尝试访问“颜色”表中的字段时,问题显示

imagine -> colta [ index ].r = r;

也许这只是我犯的一个小错误,但我找不到它。有没有人有想法?

谢谢! :)

修改

主要功能中的代码就是这样:

XPM *img;
initXPM(img, 10, 10, 1, 3);
setXPMColor(img, 0, 255, 255, 255, "0");

setXPMColor函数如下所示:

void setXPMColor(XPM *imagine,
    unsigned int index,
    unsigned char r,
    unsigned char g,
    unsigned char b,
    char *charpattern) {


   imagine -> colta [ index ].r = r;
   imagine -> colta [ index ].g = g;
   imagine -> colta [ index ].b = b;
   imagine -> colta [ index ].pchars = charpattern;
}

2 个答案:

答案 0 :(得分:2)

sizeof用法错误,sizeof ( imagine -> colta )是指针的大小。

你的意思是:

imagine->colta = malloc(ncolors * sizeof *imagine->colta);
                                         ^
                                         |
                                    important!

注意星号,这意味着“此指针所指向的数据的大小”,即sizeof (Color)

另外,当然要确保分配实际成功。

另外,please don't cast the return value of malloc() in C

<强>更新

您的问题似乎在于您如何调用初始化结构的函数;您正在删除顶级malloc() ed XPM指针:

XPM *img;
initXPM(img, 10, 10, 1, 3);
setXPMColor(img, 0, 255, 255, 255, "0");

应该是这样的:

XPM *img = initXPM(10, 10, 1, 3);
setXPMColor(img, 0, 255, 255, 255, "0");

当然initXPMreturn本地imagine变量,以便调用者获取该指针。

答案 1 :(得分:0)

void func(type *pointer){
    //"type *pointer" : The only variable on the stack
    pointer = malloc(sizeof(type));//But is not set to the original.
    retrurn;
}

简短的测试代码:

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

void init_int_pointer(int *p){
    p = malloc(sizeof(*p));
}

int main(){
    int *p = NULL;
    printf("before : %p\n", (void*)p);//NULL
    init_int_pointer(p);
    printf("after : %p\n", (void*)p);//NULL

    return 0;
}

修复

1)
type * func(){
    type *pointer = malloc(sizeof(type));
    retrurn pointer;
}
...
type *p = func();

2)
void func(type **pointer){
    *pointer = malloc(sizeof(type));
    retrurn ;
}
...
type *p;
func(&p);