Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти (C) / 15 сообщений из 15, страница 1 из 1
17.04.2013, 20:21
    #38229950
Alex Zhulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
Добрый день!
Подскажите, пжл, про выделение памяти в 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
17.04.2013, 20:28
    #38229958
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
17.04.2013, 20:30
    #38229961
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
Но тогда придётся таки знать количество записей при выделении data. Если и тогда оно
неизвестно, то тебе дорога к связным спискам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.04.2013, 20:35
    #38229967
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
17.04.2013, 20:36
    #38229968
Alex Zhulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
17.04.2013, 20:45
    #38229979
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
17.04.2013, 20:47
    #38229982
Alex Zhulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
Код: 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
17.04.2013, 20:48
    #38229983
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
17.04.2013, 20:52
    #38229986
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
17.04.2013, 20:56
    #38229989
Alex Zhulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
17.04.2013, 21:25
    #38230003
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.
#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
17.04.2013, 21:32
    #38230010
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
Alex ZhulinКто и как в данном случае выделяет память?
Пушкин А.С.
Это называется "дуракам везёт" и все твои тыканья пришлись в пределах параграфа,
минимального размера динамической памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.04.2013, 21:37
    #38230019
Alex Zhulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
Dimitry SibiryakovAlex ZhulinКто и как в данном случае выделяет память?
Пушкин А.С.
Это называется "дуракам везёт" и все твои тыканья пришлись в пределах параграфа,
минимального размера динамической памяти.


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



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


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


Почему это вдруг "надо"??? "Можно" это не значит "нужно".
...
Рейтинг: 0 / 0
17.04.2013, 22:01
    #38230042
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выделение памяти (C)
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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выделение памяти (C) / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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