4

Here's what I'm trying to do:

#include <stdio.h>
#include <stdlib.h>

struct myStruct {
    int myVar;
}

struct myStruct myBigList = null;

void defineMyList(struct myStruct *myArray)
{
     myStruct *myArray = malloc(10 * sizeof(myStruct));

     *myArray[0] = '42';
}

int main()
{
     defineMyList(&myBigList);
}

I'm writing a simple C program to accomplish this. I'm using the GNU99 Xcode 5.0.1 compiler. I've read many examples, and the compiler seems to disagree about where to use the struct tag. Using a struct reference inside the sizeof() command doesn't seem to recognize the struct at all.

1
  • 1
    n = sizeof( struct myStruct ); and struct myStruct * mBigList = NULL; Commented Nov 13, 2013 at 8:25

5 Answers 5

4

There are a few errors in your code. Make it:

struct myStruct *myBigList = NULL; /* Pointer, and upper-case NULL in C. */

/* Must accept pointer to pointer to change caller's variable. */
void defineMyList(struct myStruct **myArray)
{
     /* Avoid repeating the type name in sizeof. */
     *myArray = malloc(10 * sizeof **myArray);

     /* Access was wrong, must use member name inside structure. */
     (*myArray)[0].myVar = 42;
}

int main()
{
     defineMyList(&myBigList);
     return 0; /* added missing return */
}

Basically you must use the struct keyword unless you typedef it away, and the global variable myBigList had the wrong type.

Sign up to request clarification or add additional context in comments.

3 Comments

+1 for asking to avoid "struct" in sizeof and use the instance name instead.
This worked great! Thank you! The ** was the key. Virtual drinks for everyone! Thanks again. All of you cleared up a lot of the confusion.
You should free myBigList inside main()
2

This is because struct name is not automatically converted into a type name. In C (not C++) you have to explicitly typedef a type name.

Either use

struct myStruct instance;

when using the type name OR typedef it like this

typedef struct {
    int myVar;
} myStruct;

now myStruct can simply be used as a type name similar to int or any other type.

Note that this is only needed in C. C++ automatically typedefs each struct / class name.

A good convention when extending this to structs containing pointers to the same type is here

Comments

1
    sizeof(struct myStruct)

or

    typedef struct myStruct myStrut;
    sizeof(myStruct)

Comments

0

In order to work for all 10 elements for that array the line:

myArray[0].myVar = '42';

should be:

(*myArray)[0].myVar = '42';

2 Comments

'42' is not a normal character constant though!
This seems like a comment on the accepted answer, not an answer to the question itself.
0

Shouldn't the following statement

myArray[0].myVar = '42'; 

be this?

(*myArray)[0].myVar = 42;

myvar is an integer.

1 Comment

This seems like a comment on the accepted answer, not an answer to the question itself.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.