Форум программистов, компьютерный форум, киберфорум
Наши страницы
C (Си)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
#1

Не получается выделить динамическую память. Программа вылетает, подскажите что не так?

23.11.2015, 14:39. Просмотров 1017. Ответов 17
Метки нет (Все метки)

При дебаге программа работает, при релизе - нет.
То выдает ошибку что память не выделена, то вообще вылетает (Process returned -1073741819).
В журнале событий: "Имя сбойного модуля: ntdll.dll"

C
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <malloc.h>
 
#define N 15
#define K 20
 
typedef struct list1
{
    char* numb;
    struct list1* next;
}LIST;
 
char* RandInt(void);
int FileCreate(void);
int ListCreate(void);
int RemoveList(void);
void PrintList(LIST* el);
 
LIST *first,*last;
 
int main(void)
{
    srand(time(NULL));
    FileCreate();
    ListCreate();
    PrintList(first);
 
    RemoveList();
 
    return 1;
}
 
int FileCreate(void)
{
    int i;
    char buf[N+2];
    FILE* file;
    file=fopen("data.txt","wt");
    for(i=0;i<K;i++)
    {
        strcpy(buf,RandInt());
        fputs(buf,file);
    }
    fclose(file);
    return 1;
}
 
char* RandInt(void)
{
    char buf[N+2];
    char digit[]="0123456789";
    int i;
    for(i=0;i<N;i++)
        buf[i]=digit[rand()%10];
    buf[i]='\n';
    buf[i+1]='\0';
    return buf;
}
 
int ListCreate(void)
{
    char buf[N+2];
    FILE* file;
    LIST* new_el;
    file=fopen("data.txt","rt");
    while(fgets(buf,N+2,file))
    {
        new_el=(LIST*)calloc(1,sizeof(LIST));   //если закомментировать эту строку, выводит <null> 
        if(!new_el)
        {
            printf("\nError!");
            return 0;
        }
        new_el->numb=malloc(strlen(buf));
        if(!new_el->numb)
        {
            printf("\nError!");
            return 0;
        }
        strcpy(new_el->numb,buf);
        if(first==NULL)
        {
            new_el->next=NULL;
            first=last=new_el;
        }
        else
        {
            last->next=new_el;
            new_el->next=NULL;
            last=new_el;
        }
    }
    fclose(file);
    return 1;
}
 
int RemoveList(void)
{
    LIST* del=first;
    while(del!=NULL)
    {
        first=first->next;
        free(del->numb);
        free(del);
        del=first;
    }
    return 1;
}
 
void PrintList(LIST* el)
{
    if(el==NULL)
        return;
    printf("%s",el->numb);
    PrintList(el->next);
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2015, 14:39
Ответы с готовыми решениями:

Подскажите, как выделить динамическую память в функции?
Добрый вечерок^_^ Подскажите, как выделить динамическую память под матрицу...

Как выделить динамическую память для матрицы?
Как выделить динамическую память для матрицы?

Не получается загрузить структуру в динамическую память
Есть массив структур треугольников, нужно прочесть из файла длину 3-х сторон...

Подскажите как переделать программу в динамическую память
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include &lt;stdlib.h&gt; #include...

Не работает программа, подскажите что не так ?
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main(void) { char F1, F2,...

17
S_el
2138 / 1668 / 353
Регистрация: 15.12.2013
Сообщений: 6,625
23.11.2015, 15:02 #2
stalteri, где хоть падает?
0
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
23.11.2015, 15:07  [ТС] #3
при дебаге не падает, поэтому точно не знаю, но думаю что на 71 строке
0
S_el
2138 / 1668 / 353
Регистрация: 15.12.2013
Сообщений: 6,625
23.11.2015, 15:29 #4
stalteri, у меня не падает.
Единственное что,компилятор ругается на возвращение из функции указателя на локальную переменную. Поэтому для избавления от UB перепишите её так:
C
1
char *buf = (char *) malloc(sizeof(char) * (N+2));
и при вызове:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int FileCreate(void)
{
    int i;
    FILE* file;
    file=fopen("data.txt","wt");
    for(i=0;i<K;i++)
    {
        char *buf = RandInt();
        fputs(buf,file);
        free(buf);
    }
    fclose(file);
    return 1;
}
0
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
23.11.2015, 17:54  [ТС] #5
у меня тоже сначала не падала, а потом как переклинило...
а в какой среде вы работаете?
0
S_el
2138 / 1668 / 353
Регистрация: 15.12.2013
Сообщений: 6,625
23.11.2015, 18:52 #6
stalteri, Windows. Компилировал cl и gcc 4.6.3. Оба варианта выдали список чисел и отработали без ошибок.
1
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
23.11.2015, 19:05  [ТС] #7
S_el, ладно, и на том спасибо, буду пробовать на другом компе.
0
S_el
2138 / 1668 / 353
Регистрация: 15.12.2013
Сообщений: 6,625
23.11.2015, 19:38 #8
stalteri, если скажете какую задачу решаете будет проще переписать код.
0
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
23.11.2015, 20:37  [ТС] #9
S_el, Вот моя задача: Разработать функцию, которая формирует символьную строку, состоящаю из десятичных цифр 15-разрядного случайного целого числа (число надо сформировать из 15 случайных цифр). Используя разработанную функцию, создать текстовый файл с K таких длинных случайных чисел. Затем, читая данные из файла, сформировать список из этих чисел. Далее исключить из списка все числа, цифровой корень которых меньше 5. Подсказка: чтобы найти цифровой корень числа, надо добавить все цифры этого числа, затем все цифры найденной суммы и повторять добавления цифр, пока сумма не станет одноразрядным числом.

Ток начал писать функцию для нахождения цифрового корня и программа перестала работать.
0
S_el
2138 / 1668 / 353
Регистрация: 15.12.2013
Сообщений: 6,625
24.11.2015, 00:39 #10
stalteri, а зачем вам вообще структура List?
P.S. Исправленный вариант тоже ошибку выбивает?
+ какая у вас система и компилятор?
0
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
24.11.2015, 01:27  [ТС] #11
S_el, тип LIST для создания односвязного списка, и да, исправленный вариант тоже не работает.
У меня Windows 10, работаю на CodeBlocks 13.12, компилятор: mingw32-gcc-4.7.1
0
Pobeda
1 / 1 / 3
Регистрация: 08.10.2015
Сообщений: 34
24.11.2015, 08:47 #12
у меня ругается на 60 строке, warning: function returns address of local variable [-Wreturn-local-addr]

Добавлено через 10 минут
и еще на 106 строке --Cannot find bounds of current function

Добавлено через 31 минуту
объясни что делает ListCreate, при каждом итерации запрашивается динамический память,но прежний память не освобождается, выходит что для new_el и new_el->numb размер памяти будет расти пока fgets не вернет eof


Добавлено через 37 минут
вот тут char* RandInt(void)
{
char buf[N+2];

добавляй

static char buf[N+2];

и все будет работать.

но все равно не понимаю, если при каждой итерации запрашивается память, тогда этот память будет расти в размерах или нет ?

Добавлено через 1 минуту
0
Миниатюры
Не получается выделить динамическую память. Программа вылетает, подскажите что не так?  
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
24.11.2015, 21:02  [ТС] #13
Цитата Сообщение от Pobeda Посмотреть сообщение
объясни что делает ListCreate, при каждом итерации запрашивается динамический память,но прежний память не освобождается, выходит что для new_el и new_el->numb размер памяти будет расти пока fgets не вернет eof
ListCreate создает динамический список, для new_el и new_el->numb каждый раз выделяется новый участок памяти.

Добавлено через 3 минуты
Цитата Сообщение от Pobeda Посмотреть сообщение
но все равно не понимаю, если при каждой итерации запрашивается память, тогда этот память будет расти в размерах или нет ?
она не будет расти, malloc() выделяет новый участок, расширяет участок realloc()

Добавлено через 4 часа 5 минут

Решил проблему, сделал так:

C
1
char *buf = (char *) malloc(sizeof(char) * (N+2));
и при вызове:

int FileCreate(void)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
{
   int i;
   FILE* file;
   file=fopen("data.txt","wt");
       for(i=0;i<K;i++)
       {
           char *buf = RandInt();
           fputs(buf,file);
           free(buf);
       }   
       fclose(file);
       return 1;
}
а потом заменил это:
C
1
new_el->numb=malloc(strlen(buf));
на это:
C
1
new_el->numb=malloc(sizeof(buf));
0
S_el
2138 / 1668 / 353
Регистрация: 15.12.2013
Сообщений: 6,625
24.11.2015, 21:19 #14
Лучший ответ Сообщение было отмечено stalteri как решение

Решение

stalteri, переписал ваш код,попробуйте запустить у себя:

C
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
 
typedef unsigned int uint;
typedef struct test_list
{
    char* numb;
    struct test_list *next;
} LIST;
 
char* RandInt(uint length);
void FileCreate(uint count,uint length);
void ListCreate(uint length);
 
LIST *head = NULL,*curr = NULL;
 
LIST* create_list(char* val)
{
    LIST *ptr = (LIST*)malloc(sizeof(LIST));
    if(NULL == ptr)
        return NULL;
 
    ptr->numb = (char *) malloc(sizeof(char) * (strlen(val)));
    strcpy(ptr->numb,val);
    ptr->next = NULL;
 
    head = curr = ptr;
    return ptr;
}
 
LIST* add_to_end(char* val)
{
    if(NULL == head)
        return (create_list(val));
 
    LIST *ptr = (LIST*)malloc(sizeof(LIST));
    if(NULL == ptr)
        return NULL;
 
    ptr->numb = (char *) malloc(sizeof(char) * (strlen(val)));
    strcpy(ptr->numb,val);
    ptr->next = NULL;
 
    curr->next = ptr;
    curr = ptr;
 
    return ptr;
}
 
void print_list()
{
    LIST * current = head;
 
    while (current != NULL) {
        printf("%s", current->numb);
        current = current->next;
    }
}
 
void remove_list()
{
    while ((curr = head) != NULL)
    {
        head = head->next;
        free(curr->numb);
        free (curr);
    }
}
 
int main(void)
{
    uint count = 10;
    uint length = 20;
    srand(time(NULL));
    FileCreate(count,length);
    ListCreate(length);
    print_list();
    remove_list();
    print_list();
    return 0;
}
 
char* RandInt(uint length)
{
    char *buf = (char *) malloc(sizeof(char) * (length+2));
    char digit[]="0123456789";
    int i;
    for(i=0;i<length;i++)
        buf[i]=digit[rand()%10];
    buf[i]='\n';
    buf[i+1]='\0';
    return buf;
}
 
void ListCreate(uint length)
{
    char buf[length+2];
    FILE* file = fopen("data.txt","rt");;
 
    while(fgets(buf,length+2,file))
        add_to_end(buf);
 
    fclose(file);
}
 
void FileCreate(uint count,uint length)
{
    FILE* file = fopen("data.txt","wt");
 
    for(int i=0;i<count;i++)
    {
        char *buf = RandInt(length);
        fputs(buf,file);
        free(buf);
    }
    fclose(file);
}
Было бы неплохо и имя файла передавать как аргумент,но это вы и сами можете изменить.

P.S. Компилировать с флагом -std=c99
1
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
25.11.2015, 02:18  [ТС] #15
S_el, спасибо, всё работает
в предыдущем варианте если заменить
C
1
new_el->numb=malloc(strlen(buf));
на
C
1
new_el->numb=malloc(sizeof(buf));
то тоже работает
0
S_el
2138 / 1668 / 353
Регистрация: 15.12.2013
Сообщений: 6,625
25.11.2015, 02:47 #16
Цитата Сообщение от stalteri Посмотреть сообщение
в предыдущем варианте если заменить
Проморгал ;-) Привык что размер char = 1. Попробуйте сравнить величины.
0
Pobeda
1 / 1 / 3
Регистрация: 08.10.2015
Сообщений: 34
25.11.2015, 07:43 #17
а static не помогло ?
0
stalteri
0 / 0 / 0
Регистрация: 23.11.2015
Сообщений: 11
26.11.2015, 21:52  [ТС] #18
Pobeda, нет, да и static там ни к чему, при каждом вызове buf заполняется новыми значениями
0
26.11.2015, 21:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2015, 21:52

Выделить динамическую память для 2-х мерного массива из N-строк
Помогите с задачей Задание: &quot;Выделить динамическую память для 2-х мерного...

Выделить динамическую память под 72 тыс элемента типа LOngint
вот решение этой задачи: const n=8000; type ab=array of longint; ...

Программа Red Horizon вылетает с ошибкой. Что я не так делаю?
http://www.cyberforum.ru/attachment.php?attachmentid=74137 D:\RedHoriz...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru