Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Vegas_I
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
#1

Изменение динамической памяти, ошибка программы - C++

31.01.2014, 16:38. Просмотров 283. Ответов 3
Метки нет (Все метки)

Есть строка, в ней слова, разделённые пробелами. Я хочу эти слова перенести в массив (чтобы потом с ними работа, ну это не суть сейчас). Массив получается двумерный, в каждой строчке по слову. Из введённой пользователем строки с помощью strtok беру по слову. Если есть слово, то в 2-й массив добавляю ещё одну строку и в неё копирую это слово. И так все слова. Но проблема с calloc: он возвращает неправильный указатель и программа вылетает. Где ошибка?
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
#include <iostream>
#include <string.h>
using namespace std;
void main()
{
    char str[50], *z;
    int k;
    unsigned int n, i;
 
 
    gets(str);
 
    n=1;
 
    char **mas;
    mas=(char**)calloc(n,sizeof(char*));
    
    z=strtok(str," ");
   
 
    while(z!=NULL)
    {
        mas=(char**)realloc(mas, n);
        mas[n-1]=(char*)calloc(15,sizeof(char));
        strcpy(&mas[n-1][0],z);
        n++;
        z=strtok(NULL," ");
    }
 
    for(i=0;i<n;i++)
        puts(&mas[i][0]);
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 16:38     Изменение динамической памяти, ошибка программы
Посмотрите здесь:

Ошибка динамической памяти на примере переворота строки - C++
Подскажите, пожалуйста, почему при одном и том же алгоритме, переворот строки не работает если использовать динамическое выделение памяти ...

Ошибка при попытке разыменовать указатель, который размещен в динамической памяти другим процессом - C++
Доброго времени суток. Есть родительский процесс, он запускает через createProcess дочерний процесс, передавая ему в командной строке...

После выполнения программы, работающей с динамической памятью, вылетает ошибка - C++
при компиляции вылетает ошибка (не может обратиться к private gолям next, val) err: C2248 если поля поместить в public, то прога...

Ошибка доступа к памяти при выходе из программы - C++
Подскажите почему после завершения работы выдаётся ошибка, что идёт запись данных в память? вроде всё очистил #include &lt;iostream&gt; ...

перераспределение динамической памяти - C++
дан двумерный массив 3х5 выделить динамически память под него, затем перераспределить ее в массив 5х3, затем удалить(выделить и удалить там...

Удаление new из динамической памяти - C++
Здравствуйте, у меня есть следующее присвоение: sign-&gt;numb = new int; Мне нужно от него избавиться в конце программы, но delete...

Теория по динамической памяти - C++
Предположим, применяется оператор new в форме для массива: p=new int ;. n ведь может быть и большим. Может n==1000000? Где запоминается,...

Вопросы по динамической памяти. - C++
У меня вопросы по работе с динамической памятью. Пожалуйста, помогите разобраться с этой темой. - чем отличается free() от delete? и...

Удаление динамической памяти - C++
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи...

Выделение динамической памяти - C++
Всем привет. Возникла задача, в которой мне необходимо знать как выделяется динамическая память средсвами new/delete. А именно,...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rrrFer
Заблокирован
31.01.2014, 17:28     Изменение динамической памяти, ошибка программы #2
ошибка в 31 строке. Потому что индексация элементов массива в С++ идет с нуля (на 13 строку смотри).
строка 23 мне кажется не нужной (не вникал, может быть ошибаюсь), не вижу необходимости изменять размер массива, причем, каким-то таинственно-нелепым образом.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6419 / 3058 / 302
Регистрация: 04.12.2011
Сообщений: 8,332
Записей в блоге: 3
31.01.2014, 17:50     Изменение динамической памяти, ошибка программы #3
Так бы можно еще:
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
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
char str[50], str_origin[50], *z;
    
gets(str_origin);
strcpy(str,str_origin);
    
    z=strtok(str," ");
int words_count=0;
 
while(z!=NULL){
 
z=strtok(NULL," ");
words_count++;
  }
cout<<endl;
 
char **mas=(char**)calloc(words_count, sizeof(char*));
 
strcpy(str,str_origin);//восстановили строку после strtok
z=strtok(str," ");
int cnt=0;
char* tmp=0;
while(z!=NULL){
tmp=z;
mas[cnt] = (char*)calloc(strlen(z)+1, sizeof(char));
strcpy(mas[cnt],z);
 
z=strtok(NULL," ");
cnt++;
  }
 
    for(int i=0;i<words_count;i++)
        puts(&mas[i][0]);
 
cout<<endl;
system("pause");
return 0;
 
}
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
31.01.2014, 17:54     Изменение динамической памяти, ошибка программы #4
Цитата Сообщение от rrrFer Посмотреть сообщение
ошибка в 31 строке.
Соглашусь, но причина в строке 26, после которой n=2, а значит есть обращение к не существующему mas[1][0]
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
#include <iostream>
#include <string.h>
using namespace std;
void main()
{
    char str[50], *z;
    int k;
    unsigned int n, i,n1;
 
 
    gets(str);
 
    n=1;
    n1=n;
    char **mas;
    mas=(char**)calloc(n,sizeof(char*));
    
    z=strtok(str," ");
   
 
    while(z!=NULL)
    {
        mas=(char**)realloc(mas, n);
        mas[n-1]=(char*)calloc(15,sizeof(char));
        strcpy(&mas[n-1][0],z);
        n++;
        z=strtok(NULL," ");
    }
 
    for(i=0;i<n1;i++)
        puts(&mas[i][0]);
 
}
Yandex
Объявления
31.01.2014, 17:54     Изменение динамической памяти, ошибка программы
Ответ Создать тему
Опции темы

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