Thursday, March 9, 2017

C Casting Question

Feeling like the casting part of my brain didn't survive the stroke.

void* value;   // Contains address of either a float or int &floatVar or &intVar

int* target = (int*)value;   // Grab that pointer and make it a pointer to int
*target = 1;                        // store int value into intVar

I am successfully passing value to sscanf for floatVar
This compiles fine, but segmentation fault when it does the last line.

Just to clarify: value is part of a struct in an array, and value has been set to &suppressProlog which is an int.  In other array elements, value = &float variable, and works fine.  Curiously, &suppressProlog is not initialized in the array.  Chasing this down is what I need to do.

The problen is that the value above is flags[flagsIndex].valueAddr and after the switch statement that drops me to this case, flagsIndex has changed from 17 to -1073743768 which causes the segmentation error.  I don't see how the switch statement could change flagsIndex, but I will replace it with if...elseif...

Looking at the surrounding code makes me wonder how late at night I wrote this mess.
Cleaned up the disastrous code, problem solved.  Code after break in a switch case is not recommended.


Paul Sand said...

I don't think there's a problem with the cast, but "value" is never given a value (despite its name, heh). Try something like

value = malloc(sizeof(int));

Paul Sand said...

Thanks for clarifying. In the sense that I have no idea what's going on.

Google tells me that

-1073743768 = -0x40000798

which, with all those 0s, makes me think "alignment issue"? Sorry, it's been a real long time since I seriously programmed in C.

Do these printfs all give the same answer?

printf("Size of void * = %d\n", sizeof(void *));
printf("Size of int * = %d\n", sizeof(int *));
printf("Size of float * = %d\n", sizeof(float *));