powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти (C)
15 сообщений из 15, страница 1 из 1
Выделение памяти (C)
    #38229950
Alex Zhulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Подскажите, пжл, про выделение памяти в C (вопрос в комментариях к коду)
Спасибо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#include <stdio.h>
#include <stdlib.h>

// Структура для записи
struct record {
    int id;
    char *name;
};

typedef struct record record_t;

// Струкутра, которая должна содержать записи описанной выше структуры
struct data {
    int number;
    char *name;
    record_t *records; // Кол-во записей заранее не известно
};

int main(int argc, char *argv[])
{
        // Инициируем структуру с записями
    struct data *my_data1 = malloc(sizeof(struct data));
    my_data1->number = 2;
    my_data1->name = "my_name2";
	// Создаем новую запись
    record_t *new_record = malloc(sizeof(record_t));
    new_record->id = 1;
    new_record->name = "name of record 1";
	// А вот тут вопрос - как выделить память под новую запись?
	// При текущей схеме получаю Segmentation fault
    my_data1->records[0] = *new_record;

}
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229958
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Zhulin
Код: sql
1.
record_t *records;// Кол-во записей заранее не известно



Писать надо так если компилятор позволяет:
Код: sql
1.
record_t records[];


или так если не позволяет:
Код: sql
1.
record_t records[1];


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229961
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но тогда придётся таки знать количество записей при выделении data. Если и тогда оно
неизвестно, то тебе дорога к связным спискам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229967
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex ZhulinДобрый день!
Подскажите, пжл, про выделение памяти в C (вопрос в комментариях к коду)
Спасибо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#include <stdio.h>
#include <stdlib.h>

// Структура для записи
struct record {
    int id;
    char *name;
};

typedef struct record record_t;

// Струкутра, которая должна содержать записи описанной выше структуры
struct data {
    int number;
    char *name;
    record_t *records; // Кол-во записей заранее не известно
};

int main(int argc, char *argv[])
{
        // Инициируем структуру с записями
    struct data *my_data1 = malloc(sizeof(struct data));
    my_data1->number = 2; 
    my_data1->name = "my_name2";
    my_data1->records = (record_t*)malloc(sizeof(record_t)*my_data1->number);
	// Создаем новую запись 1
    my_data1->records[0].id = 1;
    my_data1->records[0].name = "name of record 1";
	// Создаем новую запись 2
    my_data1->records[1].id = 2;
    my_data1->records[1].name = "name of record 2";

}
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229968
Alex Zhulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAlex Zhulin
Код: sql
1.
record_t *records;// Кол-во записей заранее не известно



Писать надо так если компилятор позволяет:
Код: sql
1.
record_t records[];




record_t records[]; - так позволяет, но как потом выделить память под массив?
Пытался так
Код: sql
1.
my_data1->records[0] = malloc(sizeof(record_t));



Но компилятор "ругается"
error: incompatible types when assigning to type ‘record_t’ from type ‘void *’
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229979
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Zhulinно как потом выделить память под массив?

Так:
Код: sql
1.
2.
3.
4.
5.
struct data *my_data1 = malloc(sizeof(struct data)+2*sizeof(record_t));
my_data1->number = 2;
my_data1->name = "my_name2";
my_data1->records[0].id=1;
my_data1->records[0].name = "name of record 1";


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229982
Alex Zhulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
    my_data1->name = "my_name2";
    my_data1->records = (record_t*)malloc(sizeof(record_t)*my_data1->number);



И так тоже не получается :-(

error: incompatible types when assigning to type ‘record_t’ from type ‘struct record_t *’
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229983
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex ZhulinДобрый день!
Подскажите, пжл, про выделение памяти в C (вопрос в комментариях к коду)
Спасибо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
#include <stdio.h>
#include <stdlib.h>

// Структура для записи
struct record {
    int id;
    char *name;
};

typedef struct record record_t;

// Струкутра, которая должна содержать записи описанной выше структуры
struct data {
    int number;
    char *name;
    record_t records[1]; // Кол-во записей заранее не известно
};

int main(int argc, char *argv[])
{
   int num_records=2;

        // Инициируем структуру с записями
    struct data *my_data1 = (struct data *)malloc(sizeof(struct data)+sizeof(record_t)*(num_records-1));
    my_data1->number = num_records;
    my_data1->name = "my_name2";
	// Создаем новую запись
    my_data1->record[0].id = 1;
    my_data1->record[0].name = "name of record 1";

    my_data1->record[1].id = 2;
    my_data1->record[1].name = "name of record 2";

}
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229986
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Zhulin
Код: plaintext
1.
2.
    my_data1->name = "my_name2";
    my_data1->records = (record_t*)malloc(sizeof(record_t)*my_data1->number);



И так тоже не получается :-(

error: incompatible types when assigning to type ‘record_t’ from type ‘struct record_t *’
Ты наверное поменял struct data
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38229989
Alex Zhulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAlex Zhulinно как потом выделить память под массив?

Так:
Код: sql
1.
2.
3.
4.
5.
struct data *my_data1 = malloc(sizeof(struct data)+2*sizeof(record_t));
my_data1->number = 2;
my_data1->name = "my_name2";
my_data1->records[0].id=1;
my_data1->records[0].name = "name of record 1";




СПАСИБО БОЛЬШОЕ!!!
Так получилось
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38230003
Alex Zhulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно вдогонку еще один вопрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <stdio.h>
#include <stdlib.h>

struct record {
    int id;
    char *name;
};

typedef struct record record_t;

struct data {
    int number;
    char *name;
    record_t records[];
};

int main(int argc, char *argv[])
{
    struct data *my_data1 = malloc(sizeof(struct data)/* + sizeof(record_t)*/); // Убрал выделение памяти под records[]
    my_data1->number = 2;
    my_data1->name = "my_name2";
    my_data1->records[0].id = 1;
    my_data1->records[0].name = "test";
    my_data1->records[1].id = 2;
    my_data1->records[1].name = "test1";

    printf("number1 = %d, name1 = %s\n", my_data1->number, my_data1->name);
    printf("id[0] = %d, name[0] = %s\n", my_data1->records[0].id, my_data1->records[0].name);
    printf("id[1] = %d, name[1] = %s\n", my_data1->records[1].id, my_data1->records[1].name);

    return 0;
}



Убрал выделение памяти под records[], но тем не менее получается добавлять новые записи (records[])
Кто и как в данном случае выделяет память?
Спасибо.
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38230010
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex ZhulinКто и как в данном случае выделяет память?
Пушкин А.С.
Это называется "дуракам везёт" и все твои тыканья пришлись в пределах параграфа,
минимального размера динамической памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38230019
Alex Zhulin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAlex ZhulinКто и как в данном случае выделяет память?
Пушкин А.С.
Это называется "дуракам везёт" и все твои тыканья пришлись в пределах параграфа,
минимального размера динамической памяти.


Понял :-)
Спасибо
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38230038
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAlex Zhulin
Код: sql
1.
record_t *records;// Кол-во записей заранее не известно



Писать надо так если компилятор позволяет:
Код: sql
1.
record_t records[];


или так если не позволяет:
Код: sql
1.
record_t records[1];


Почему это вдруг "надо"??? "Можно" это не значит "нужно".
...
Рейтинг: 0 / 0
Выделение памяти (C)
    #38230042
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex ZhulinДобрый день!
Подскажите, пжл, про выделение памяти в C (вопрос в комментариях к коду)Судя по коду ты пишешь все-таки на С++.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#include <stdio.h>
#include <stdlib.h>

// Структура для записи
struct record {
    int id;
    char *name;
};

typedef struct record record_t;

// Струкутра, которая должна содержать записи описанной выше структуры
struct data {
    int number;
    char *name;
    record_t *records; // Кол-во записей заранее не известно
};

int main(int argc, char *argv[])
{
        // Инициируем структуру с записями
    struct data *my_data1 = malloc(sizeof(struct data));
    my_data1->number = 2;
    my_data1->name = "my_name2";
	// Создаем новую запись
    record_t *new_record = malloc(sizeof(record_t) * my_data1->number);
    new_record->id = 1;
    new_record->name = "name of record 1";
	// А вот тут вопрос - как выделить память под новую запись?
	// При текущей схеме получаю Segmentation fault
    my_data1->records[0] =  new_record;  // убери звездочку. 

}

[/quot]И все.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти (C)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]