@Johnem

Как работает данный кусок кода на Си?

Есть следующий кусок кода:
#include <stdio.h>
 
typedef struct
{
    int age;
    char *name;
} Person;
 
int main(void)
{
    Person people[4];
    
    int n = sizeof(people)/sizeof(people[0]);
    for(int i=0; i<n; i++)
    {
        people[i].name = "John";
        people[i].age = 23;
    }
    for(int i=0; i<n; i++)
    {
        printf("Name: %s \t Age: %d \n", people[i].name, people[i].age);
    }
    return 0;
}

Я не могу понять как работает *name, по-идее мы создаем указатель на name типа char, но какова тогда максимальная длинна name? Нужно ли очищать память после использования конкретной структуры (например people[0]), если она больше не понадобиться, но остальные элементы массива еще нужны? В дальнейшем я хочу попробовать написать динамический массив структур (довольно большой (до 10^6 структур)), нужно ли использовать realloc?
  • Вопрос задан
  • 119 просмотров
Решения вопроса 3
xorknown
@xorknown
Будут проблемы - решайте
Вам бы всё-таки к книге обратиться, а не к данному ресурсу.
Очищать память, если имеется ввиду освобождать, надо только после выделения памяти. Если ваша программа где-либо вызывает malloc и т.п., то нужно вызывать free, не иначе.
Динамические массивы и массивы большого размера лучше не выделять на стеке. Можно во время выполнения поймать переполнение стека. И при выделении массива помните, что память не бесконеча, и вам может ее не хватить. Опять же, если прочитать документацию, то realloc можете вызывать только после обязательного вызова malloc. Это все работа с аллокаторами, которые работают с динамической памятью.

Максимальный размер name. Name - это указатель, в котором хранится адрес, адрес на память. В нем не хранится ни размер, ни данные о том на что он указывает, ему без разницы, он всегда будет одного размера. В вашем случае, при компиляции в программе заранее выделяется память под все текстовые данные которые указаны у вас в коде, на них и указывает указатель. Если вы захотите сохранять введённые данные, то вам придется воспользоваться выделением памяти.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. Максимальная длина name зависит от компилятора и системы, под которую будет компилироваться программа. Какой максимальный блок памяти они позволяют выделить, такая и будет максимальная длина (минус 1).
2. Освобождать нужно ту память, которая выделялась динамически. Отдельно элемент name, отдельно саму структуру People. Если память выделялась статически, то и освобождать её не надо.
3. Использование realloc зависит от конкретной реализации. Можно реализовать как с ним, так и без.
Ответ написан
Комментировать
gbg
@gbg
Любые ответы на любые вопросы
Похоже, вы решили пропустить пару-тройку глав по базовым понятиям языка и сразу рвануть к сути.
У вас создается строковый литерал "John", который размещается где-то памяти, а потом вы 4 раза заталкиваете указатель на эту штуку в структуру, так что у вас по сути не 4 строки, а одна.

Вам нужно на каждой итерации вашего цикла делать malloc, чтобы выделить память под строку, а потом копировать туда строку при помощи strncpy или аналога.

Что касается необходимости применения realloc -вам он понадобится, если вы собираетесь реализовывать динамическое наращивание массива. И впредь не задавайте в одном топике больше одного вопроса.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы