6

I'm trying to do the following

int a[8]={1,2,3,4,5,6,7,8};

printf("%f\n", *(float *)a);
printf("%f\n", *((float *)a+1));
printf("%f\n", *((float *)a+2));
printf("%f\n", *((float *)a+3));
printf("%f\n", *((float *)a+4));
printf("%f\n", *((float *)a+5));
printf("%f\n", *((float *)a+6));
printf("%f\n", *((float *)a+7));

I get

0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

The reason why I'm trying to print the elements in this way is because, I want to cast the int pointer to the array to the float pointer and pass it as a parameter for another function which only takes float *.

It seems that this does not work well. Can someone explain why this is not working?

int *ptr;
function((float *)ptr);

If I do this the function does not read the values the pointer is pointing to properly.. just returning 0.0000.

Sourav Ghosh
  • 133,132
  • 16
  • 183
  • 261
lukieleetronic
  • 623
  • 7
  • 10
  • 23

4 Answers4

6

This is not correct. int and float are not guaranteed to have the same alignment.

Remember: Casting a value and casting a pointer are different scenarios. Casting a pointer changes the way to refer to the type value, which can almost certainly result in a mis-alignment in most of the cases.

As per C11 standard document, chapter §6.3.2.3

A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned68) for the referenced type, the behavior is undefined.

In your case, a work-around may be

printf("%f\n", (float)*a);  //cast the value, not the pointer
Sourav Ghosh
  • 133,132
  • 16
  • 183
  • 261
  • The question is asked for C, not C++ – infinite loop Jul 25 '17 at 15:01
  • 2
    @infiniteloop If I am not in an urgent need to book a visit to an ophthalmologist, I don't see any mention of CPP in my answer and I believe I don't need to book a visit either. clarification, please? – Sourav Ghosh Jul 25 '17 at 15:05
  • 1
    Sincere apologies @Sourav. I overlooked it. – infinite loop Jul 25 '17 at 15:10
  • 2
    @infiniteloop never mind, and I believe we all have a little space for humor, hope I did not offend you either, right? – Sourav Ghosh Jul 25 '17 at 15:11
  • No not at all :), that was my mistake. Between on `gcc 4.8.5 - 64bit`, where size of int and float are 4 bytes, when I tried to convert int value to float through `float *` as above, store it in float and again back to another int variable. I could get the actual data. According to my observation, `printf()` in C could not actually print very low values of int (I mean to say 4 byte value stored as an integer not float), so it is printing `0`. Increasing the value of int and gives a correct result. – infinite loop Jul 25 '17 at 15:22
  • According to my observation, printf() in C could not actually print very low values of int *as float*(I mean to say 4 byte value stored as an integer not float), so it is printing `0.000000`. Increasing the value of int,gives a correct result (I mean float value corresponding to int value, i.e., int of 10 doesn't gives 10.000000, rather it gives value depending on method used to implement float in the compiler). – infinite loop Jul 25 '17 at 15:33
3

You cannot cast a pointer to int to a pointer to float, and expect to get your value converted to the corresponding number in floating point representation. Casting a single value works, but casting by changing a pointer type does not alter the representation.

If you need an array of floats, declare an array of floats, and cast one element at a time:

float b[8];
for (int i = 0 ; i != 8 ; i++) {
    b[i] = a[i];
}
func_expects_float(b, 8);
Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
0

Casting an int pointer to a float doesn't convert the integer to a floating point number. Casting just tells the machine to use the contents of the memory location pointed to by the pointer as floating point value instead of an integer value. But it doesn't change the value from integer representation to floating point representation.

Bishakh Ghosh
  • 1,205
  • 9
  • 17
0

you might try:

printf( "%f\n", 1.0f * a[0]); 
printf( "%f\n", 1.0f * a[1]); 
.... 

==or==

printf( "%f\n", *(a+0) * 1.0f ); 
printf( "%f\n", *(a+1) * 1.0f ); 
....
user3629249
  • 16,402
  • 1
  • 16
  • 17