1 | |
Второе удаление подмассива18.11.2013, 08:32. Показов 1444. Ответов 18
Метки нет (Все метки)
Обьясните, почему после второго удаления подмассива происходит ошибка памяти.
C++ struct massiv { massiv() { as = new char*[N]; for(int i = 0; i < N; i++) as[i] = new char[2]; for(int i = 0; i < N; i++) as[i][0] = " "; } void add(int id, char* s) { delete [] as[id]; int sz = strlen(s); as[id] = new char[sz]; as[id] = s; } }; int main() { massiv my; my.add(0, "Hello, "); // ok my.add(1, "world"); // ok my.add(1, "people"); // bad allocation }
0
|
18.11.2013, 08:32 | |
Ответы с готовыми решениями:
18
Удаление из строки каждое второе вхождение заданной подстроки Pascal Если второе число равно первому и оба нечетные, то вывести второе число Выделение подмассива Поиск максимального подмассива |
Неэпический
|
|||||||||||
18.11.2013, 08:41 | 2 | ||||||||||
Сообщение было отмечено как решение
Решение
Добавлено через 1 минуту
1
|
18.11.2013, 08:59 [ТС] | 5 |
Croessmah, ок, спасибо, пока кнопку "спасибо" нажимать не буду, чтобы позже вечером, когда буду дома, проверить будет ли так работать или нет, и если работает, то оставлю вам положительный отзыв.
0
|
programina
|
18.11.2013, 09:16
[ТС]
#7
|
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
18.11.2013, 09:30 | 8 | |||||
1
|
18.11.2013, 10:05 [ТС] | 9 |
Проверьте вывод программы, пожалуйста.
C++ #include <cstdio> #include <cstring> #define N 100 struct massiv { massiv () { as = new char *[ N ] ; for ( int i = 0 ; i < N ; i ++ ) as [ i] = new char [2 ] ; for ( int i = 0 ; i < N ; i ++ ) as [ i] = " " ; } char **as; void add ( int id, char * s ) { delete [] as [ id] ; int sz = strlen ( s) ; as[id] = new char[ sz+1] ; for(int i = 0; i < sz; i ++) as [ id][i] = s[i]; as[id][sz] = '\0'; } char *get(int id) { return as[id]; } } ; int main () { massiv my; my. add (0 , "Hello, " ) ; my. add (1 , "world" ) ; printf( "%s", my.get(0) ); printf( "%s\n", my.get(1) ); my.add(1, "people"); printf( "%s", my.get(0) ); printf( "%s\n", my.get(1) ); }
0
|
Модератор
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
|
||||||
18.11.2013, 10:28 | 10 | |||||
Исправьте только 11 строку на
1
|
18.11.2013, 11:08 [ТС] | 11 |
точно! Здесь тоже надо.
Добавлено через 7 минут Сейчас все работает. Всем спасибо. Добавлено через 9 минут Croessmah, форум пока не разрешает добавить вам отзыв, добавлю позже. Добавлено через 16 минут C++ #include <cstdio> #include <cstring> #define N 100 struct massiv { massiv () { as = new char *[N] ; for ( int i = 0 ; i < N ; i++ ) as[i] = new char[2] ; for ( int i = 0 ; i < N ; i++ ) //strcpy( as[i], "-" ) ; { as[i][0] = '-'; as[i][1] = '\0'; } } char **as; void add ( int id, char * s ) { delete [] as [id] ; int sz = strlen (s) ; as[id] = new char[sz+1] ; for(int i = 0; i < sz; i ++) as[id][i] = s[i]; as[id][sz] = '\0'; } char *get(int id) { return as[id]; } } ; int main () { massiv my ; my.add(2 , "Hello, ") ; my.add(3 , "world") ; my.add(4, "?"); for(int i = 0; i < 7; i++) printf( "%s", my.get(i) ); printf("\n"); my.add(3, "people"); my.add(4, "!"); for(int i = 0; i < 7; i++) printf( "%s", my.get(i) ); printf("\n"); } Bash --Hello, world?--
--Hello, people!--
0
|
18.11.2013, 11:10 | 12 |
programina, таких недоразумений можно избежать, навсегда запомнив правило, что строковые литералы не нужно изменять, поэтому всегда предварять const. Ошибка будет на этапе компиляции, а не выполнения.
В данном случае mingw, например, выдает варнинг conversion from string constant to 'char*'.
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
18.11.2013, 11:36 | 14 | |||||
И чему это поможет? Написать
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
18.11.2013, 11:50 | 16 |
Разве? Да и такого знания хватает только на то, чтоб считать чужие ошибки на двойку, или стирать ересь. Для того, чтоб писать своё, надо знать, как надо, а не как нельзя. Если только не пишешь наглядное пособие, как делать не надо.
0
|
BumerangSP
|
18.11.2013, 12:41
#17
|
Не по теме: taras atavin, понятное дело, нужно знать, что пишешь. Только здесь играет роль и человеческий фактор. Ошибаться свойственно всем людям.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
18.11.2013, 13:11 | 18 |
Оно конечно так, но так просто от ошибок не избавишься. Даже конкретно эта ошибка алгоритмическая и синтаксическими средствами её можно только прикрыть "туманом".
0
|
SatanaXIII
|
||||||
18.11.2013, 14:18
Второе удаление подмассива
#19
|
||||||
0
|
18.11.2013, 14:18 | |
Поиск подмассива в массиве Программа возвращения подмассива. Поиск подмассива в массиве Переворот подмассива 2 раза Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |