Разница между определениями 2 struct
заключается в том, что вы предварительно распределяете хранилище в одном struct
и объявляете указатель в другом struct
.
В вашем первом struct
у вас есть char *
. char *
- указатель. Это не указывает ни на что. Вам необходимо динамически выделить некоторую память, а затем указать указатель char *
на выделенную память.
В вашем втором struct
у вас есть char name[4]
. Это массив, и вам выделяется 4 байта для этого массива. Это выделено и готово к использованию.
Используйте первый struct
, если вы заранее не знаете размер буфера. Выделите произвольный объем памяти, например 1024 байта, используя malloc
. Затем читайте за 1024 байта данных за раз. Продолжайте делать это, пока не сможете вычислить, насколько велики данные, а затем используйте malloc
для выделения этого объема памяти, а затем прочитайте в своих данных.
Использовать второй struct
, если вы знаете, что ваши данные всегда 4 байта, и он никогда не будет больше или меньше этого. Если вы хотите, вы можете объявить его следующим образом: char name[500]
. Это предустановит 500 байтов для вас, и пока ваша строка не будет больше 499 символов, это будет работать. Тем не менее, вы можете тратить память (что в наши дни не так уж и много). Наиболее эффективным способом преодоления этой проблемы является динамическое распределение объема необходимой вам памяти. malloc
Последнее предупреждение .... Помните, что для строк в C требуется достаточно памяти для самой строки, плюс нулевой ограничитель.Например:
/* I am allocating 5 bytes to store my name.
My name is Alan, so I'm allocating 4 bytes
plus 1 additional byte for the null terminator
*/
char myName[5];
myName[0] = 'A'; // A
myName[1] = 'l'; // l
myName[2] = 'a'; // a
myName[3] = 'n'; // n
myName[4] = '\0'; // Null Terminator
printf("%s", myName); // Prints Alan
'char name [4];' -> имя символа [5]; 'или больше. Также перед использованием вам нужно выделить для 's1.name'. – BLUEPIXY