Jump to content
Sign in to follow this  

C struct with array

Recommended Posts


I have this code in VC2010:

typedef struct CvScalar
    double val[4];
CvScalar  cvScalarAut( double val0, double val1 ,
                               double val2 , double val3 ){
    CvScalar scalar;
    scalar.val[0] = val0; scalar.val[1] = val1;
    scalar.val[2] = val2; scalar.val[3] = val3;
    return scalar;

When I call the func like this:

CvScalar test = cvScalarAut( 234,10,45,200);
printf(" %f %f %f %f %f \n",test, test.val[0], test.val[1],test.val[2],test.val[3]);

I get:


Why 'test' correspond to the first array's value and 'test.val[0]' to the second and not the first?

And test.val[3] gives again the first value?

Share this post

Link to post
Share on other sites

First of all, your code is invalid: you're passing a structure as the first parameter to printf() while it is expecting a float. printf() works by looking at the string specifier and pulling the appropriate amount of data from the stack, which you wrongly populated with the contents of the structure *twice*. Remember that in the default C calling convention arguments are passed in reverse order, so they can be popped in left-to-right order by the callee, and that you passed the structure *as a single piece*. This is how the stack will look, from top to bottom, right before control is passed to printf():

// top
test.val[1]    test  
test.val[2]  /    
test.val[3] /           
test.val[0] <= test.val[0]
test.val[1] <= test.val[1]
test.val[2] <= test.val[2]
test.val[3] <= test.val[3]

printf() will then pop 5 floats from the stack and print them, which explains the behavior you are seeing. The lesson to take is *don't pass printf() anything but exactly what it is expecting*, which *is not* a struct and 4 floats, but *exactly 5 floats*.

Edited by danielkza
  • Like 2

Share this post

Link to post
Share on other sites

Thank you, now it's clear.

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this