0

I really don't know what the issue is here. The compiler says it's all okay, but when I run it, the executable crashes ( I believe it's a segmentation fault problem ). They say two minds are always better than one, so I hope you guys can find whatever I have missed.

Okay, so it goes this way: I have 2 structures:

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

Then, in a function I allocate memory for the XPM structure and then for the Color array inside the XPM structure (I won't write the fail safe code here):

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 */

The problem shows when I try accessing the fields in the Color table

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

Maybe it's just a small mistake I made, but I cannot find it. Does anyone have an idea?

Thank you! :)

EDIT

The code in the main function to this extent is this:

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

The setXPMColor function goes like this:

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;
}
Sebastian Luke
  • 385
  • 5
  • 18

2 Answers2

2

Your sizeof usage is wrong, sizeof ( imagine -> colta ) is the size of the pointer.

You mean:

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

Note the asterisk, which makes it mean "the size of the data pointed at by this pointer", i.e. sizeof (Color).

Also, make sure the allocations actually succeed, of course.

Also, please don't cast the return value of malloc() in C.

UPDATE:

Your problem seems to be in how you call the function that initializes the structures; you're dropping the top-level malloc()ed XPM pointer:

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

it should be something like:

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

And of course initXPM should return the local imagine variable, so that the caller gets that pointer.

Community
  • 1
  • 1
unwind
  • 391,730
  • 64
  • 469
  • 606
  • I did it that way too, as I wrote in the above comment. I tried with sizeof(Color) too but to no prevail. btw: thank you for the casting tip. I recently have read about not having to use it, but sometime I write it out of habit. – Sebastian Luke Feb 27 '14 at 12:24
  • Then there must be something else that's going wrong. This way is the proper one (or with `sizeof (Color)`). Perhaps you should show the code that loads the data. – unwind Feb 27 '14 at 12:27
  • I just added an edit to the code. Is there anything else you need? – Sebastian Luke Feb 27 '14 at 12:33
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;
}

short test code :

#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;
}

to fix

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);
BLUEPIXY
  • 39,699
  • 7
  • 33
  • 70