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

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

Восстановить пароль Регистрация
 
Vegas_I
1 / 1 / 0
Регистрация: 28.02.2013
Сообщений: 103
31.01.2014, 16:38     Изменение динамической памяти, ошибка программы #1
Есть строка, в ней слова, разделённые пробелами. Я хочу эти слова перенести в массив (чтобы потом с ними работа, ну это не суть сейчас). Массив получается двумерный, в каждой строчке по слову. Из введённой пользователем строки с помощью 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++
перераспределение динамической памяти C++
C++ Выделение динамической памяти
C++ выделение динамической памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rrrFer
Заблокирован
31.01.2014, 17:28     Изменение динамической памяти, ошибка программы #2
ошибка в 31 строке. Потому что индексация элементов массива в С++ идет с нуля (на 13 строку смотри).
строка 23 мне кажется не нужной (не вникал, может быть ошибаюсь), не вижу необходимости изменять размер массива, причем, каким-то таинственно-нелепым образом.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,723
Записей в блоге: 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     Изменение динамической памяти, ошибка программы
Ответ Создать тему
Опции темы

Текущее время: 16:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru