struct looses initialization when passing to a function

Discussion in 'C Programming' started by ArifulHossain tuhin, Mar 2, 2012.

  1. i have a stuct like following:
    typedef struct{
    char static[10];
    int a;
    int b;
    }my_type;

    now i've initialized it like following:

    my_type * s;

    s = (my_type *)malloc(sizeof(my_type));
    memmove(a->static,buf,len);
    s->a = 1;
    s->b = 2;
    myfunc((void *)&s);


    void myfun(void ** data);

    inside myfun i retain initialization for the static[10] field. but i loose other initializations of field a and field b.

    thanks in advance.
    ArifulHossain tuhin, Mar 2, 2012
    #1
    1. Advertising

  2. ArifulHossain tuhin

    Ian Collins Guest

    On 03/ 3/12 04:17 AM, ArifulHossain tuhin wrote:
    > i have a stuct like following:
    > typedef struct{
    > char static[10];
    > int a;
    > int b;
    > }my_type;
    >
    > now i've initialized it like following:
    >
    > my_type * s;
    >
    > s = (my_type *)malloc(sizeof(my_type));
    > memmove(a->static,buf,len);
    > s->a = 1;
    > s->b = 2;
    > myfunc((void *)&s);
    >
    >
    > void myfun(void ** data);
    >
    > inside myfun i retain initialization for the static[10] field. but i loose other initializations of field a and field b.



    Your question isn't very clear and you appear to be writing C rather
    than C++. You might be better of asking on comp.lang.c and providing
    some more details, such as the definition of myfun.

    --
    Ian Collins
    Ian Collins, Mar 2, 2012
    #2
    1. Advertising

  3. ArifulHossain tuhin

    Ian Collins Guest

    On 03/ 3/12 11:59 AM, Ian Collins wrote:

    Nonsense, please ignore!

    --
    Ian Collins
    Ian Collins, Mar 2, 2012
    #3
  4. ArifulHossain tuhin

    Kaz Kylheku Guest

    On 2012-03-02, ArifulHossain tuhin <> wrote:
    > i have a stuct like following:
    > typedef struct{
    > char static[10];


    Since static is a reserved keyword, there is no way you compiled any
    of this.

    Post a complete example that compiles and reproduces the problem
    that you perceive.
    Kaz Kylheku, Mar 2, 2012
    #4
  5. ArifulHossain tuhin

    Guest

    On Friday, March 2, 2012 3:17:53 PM UTC, ArifulHossain tuhin wrote:

    > i have a stuct like following:
    > typedef struct{
    > char static[10];
    > int a;
    > int b;
    > }my_type;
    >
    > now i've initialized it like following:
    >
    > my_type * s;
    >
    > s = (my_type *)malloc(sizeof(my_type));
    > memmove(a->static,buf,len);


    like Kaz I don't believe you compiled this. What is 'a'? and buf and len?

    > s->a = 1;
    > s->b = 2;
    > myfunc((void *)&s);
    >
    >
    > void myfun(void ** data);
    >
    > inside myfun i retain initialization for the static[10] field. but i loose other initializations of field a and field b.


    post a short, complete, compliable program that illustrates your problem
    , Mar 3, 2012
    #5
  6. On Mar 2, 9:17 am, ArifulHossain tuhin <>
    wrote:
    > i have a stuct like following:
    > typedef struct{
    > char static[10];
    > int a;
    > int b;
    >
    > }my_type;
    >
    > now i've initialized it like following:
    >
    > my_type * s;
    >
    > s = (my_type *)malloc(sizeof(my_type));
    > memmove(a->static,buf,len);
    > s->a = 1;
    > s->b = 2;
    > myfunc((void *)&s);
    >
    > void myfun(void ** data);
    >
    > inside myfun i retain initialization for the static[10] field. but i loose other initializations of field a and field b.


    Firstly, you need to cut and paste the code in question, not retype
    it. Obviously the first argument to memmove should be s->static, not
    a->static. We have no idea how many other transcription errors exist.

    Secondly, you need to show the code that is experiencing the problem.
    We have no idea what the code is for myfunc.

    Thirdly, those of who wish to examine the problem in detail often
    benefit from a compilable snippet that exhibitis the problem

    And regarding what you did post, you seem to be working under the
    micsonception that void** is a generic pointer to pointer. It most
    definitely is not. It is explicitly a pointer to void and may have a
    completely different representation and alignment requirements than
    void* which is what you send it. But until we see how myfunc uses it,
    we are just guessing.
    Barry Schwarz, Mar 3, 2012
    #6
  7. ArifulHossain tuhin

    Shao Miller Guest

    On 3/2/2012 10:17, ArifulHossain tuhin wrote:
    > i have a stuct like following:
    > typedef struct{
    > char static[10];


    Using 'static' as an identifier there has already been mentioned by others.

    > int a;
    > int b;
    > }my_type;
    >
    > now i've initialized it like following:
    >
    > my_type * s;
    >
    > s = (my_type *)malloc(sizeof(my_type));


    Please do not cast the return-value of a call to 'malloc'. It's not
    needed because 'malloc' returns a 'void *' value, which can be
    implicitly converted to any pointer-to-object type, which includes
    'my_type *'. Casting the return-value also increases the chance that if
    you forget to #include <stdlib.h>, you don't find out about it during
    translation.

    > memmove(a->static,buf,len);


    Your 'a->static' typo already mentioned by others.

    > s->a = 1;
    > s->b = 2;
    > myfunc((void *)&s);
    >
    >
    > void myfun(void ** data);
    >


    '&s' has type 'my_type **'. Suppose that the 'my_type *' type (which is
    the pointed-to type) is 4 bytes and has an alignment requirement of 4
    bytes. Suppose 'void *' has 8 bytes and has an alignment requirement of
    8 bytes.

    Your call is similar to doing:

    void ** data = (void **) &s;

    Now if '&s' pointed to address '4' (satisfying the alignment for
    'my_type *') but 'data' is expected to point to a multiple of '8'
    (satisfying the alignment for 'void *'), then this behaviour is undefined.

    > inside myfun i retain initialization for the static[10] field. but i loose other initializations of field a and field b.


    How are you attempting to access the original object that you allocated
    storage for with 'malloc' from within the body of 'myfun'?
    Shao Miller, Mar 3, 2012
    #7
  8. Barry Schwarz <> writes:
    [...]
    > And regarding what you did post, you seem to be working under the
    > micsonception that void** is a generic pointer to pointer. It most
    > definitely is not. It is explicitly a pointer to void and may have a


    You mean "pointer to pointer to void".

    > completely different representation and alignment requirements than
    > void* which is what you send it. But until we see how myfunc uses it,
    > we are just guessing.


    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    Will write code for food.
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
    Keith Thompson, Mar 3, 2012
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Fogelklou
    Replies:
    36
    Views:
    1,345
    Chris Fogelklou
    Apr 20, 2004
  2. Anand
    Replies:
    1
    Views:
    342
    Cliff Wells
    Jul 23, 2003
  3. Ole
    Replies:
    4
    Views:
    585
    Michael Wojcik
    Oct 26, 2004
  4. beetle
    Replies:
    2
    Views:
    879
    beetle
    Jan 25, 2005
  5. Replies:
    2
    Views:
    721
    David Harmon
    Sep 20, 2006
Loading...

Share This Page