Question

I have some ideas of what this would do, but I'd like a more professional and experienced explaination.

typedef struct{
     char str[50];
     unsigned short num;
}s;

s *name = (s *) malloc(sizeof(s));

The first part defines a struct. I have no problem with that
This will create a pointer to "s" struct. malloc() returns a memory address that will be cast as a pointer to "s". However, sizeof(s) I Believe I am having some issues understanding.

char str[50]; = 50 bytes.
unsigned short num; = 2 bytes.

sizeof(s) returns 52 bytes?

malloc(sizeof(s)) allocates 52 bytes and returns the first address and casts it as a pointer to "s"?

One More Question! How can I perform error handling with malloc in-line?

Thanks to anyone that can help clarify this!

Was it helpful?

Solution

  • In C, we need not cast the return value of malloc. malloc returns void* and in C, void* implicitly cast to whatever type you specify...
  • The value returned by sizeof(s) depends on padding and also on the implementation (cos, sizeof(unsigned short) will be different on different platforms...).
  • In C, if you want to check for the error, you have to compare the return value of malloc with NULL.

    if (name ==NULL) exit (1); //EXIT_FAILURE

OTHER TIPS

The value of sizeof(s) is implementation and ABI specific (it is at least 51 - and it could be 51 on hypothetical weird machines where sizeof(short)==1 and short-s are aligned like char is; I can't name any such machine). But on my Linux/Debian/Sid/x86-64 system (with x86-64 ABI) it is 52. And sizeof is computed at compile time.

How can I perform error handling with malloc in-line?

The usual practice could be

s *name = malloc(sizeof(s));
if (!name) { perror("malloc of name"); exit(EXIT_FAILURE); };
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top