Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C struct initialization with char array

Tags:

c

char

struct

I have a C struct defined as follows:

struct Guest {
   int age;
   char name[20];
};

When I created a Guest variable and initialized it using the following:

int guest_age = 30;
char guest_name[20] = "Mike";
struct Guest mike = {guest_age, guest_name};

I got the error about the second parameter initialization which tells me that guest_name cannot be used to initialize member variable char name[20].

I could do this to initialize all:

struct Guest mike = {guest_age, "Mike"};

But this is not I want. I want to initialize all fields by variables. How to do this in C?

like image 203
tonga Avatar asked Sep 23 '13 19:09

tonga


2 Answers

mike.name is 20 bytes of reserved memory inside the struct. guest_name is a pointer to another memory location. By trying to assign guest_name to the struct's member you try something impossible.

If you have to copy data into the struct you have to use memcpy and friends. In this case you need to handle the \0 terminator.

memcpy(mike.name, guest_name, 20);
mike.name[19] = 0; // ensure termination

If you have \0 terminated strings you can also use strcpy, but since the name's size is 20, I'd suggest strncpy.

strncpy(mike.name, guest_name, 19);
mike.name[19] = 0; // ensure termination
like image 61
Scolytus Avatar answered Oct 22 '22 23:10

Scolytus


mike.name is a character array. You can't copy arrays by just using the = operator.

Instead, you'll need to use strncpy or something similar to copy the data.

int guest_age = 30;
char guest_name[20] = "Mike";
struct Guest mike = { guest_age };
strncpy(mike.name, guest_name, sizeof(mike.name) - 1);

You've tagged this question as C++, so I'd like to point out that in that case you should almost always use std::string in preference to char[].

like image 38
Steve Howard Avatar answered Oct 22 '22 23:10

Steve Howard