searchaddword(char * s){
int l1=strlen(s);
char * str=new char[l1+1];
memset(str,0,sizeof(str));
strcpy(str,s);
//....
//....
delete str;
}
Собственно вопрос, все работает нормально пока слово состоит больше чем из одной буквы. Как только s - одна буква, delete str вылетает с ошибкой. Возможно я чего то не понимаю, но ведь переменную динамическую которая состоит из 1 символа можно очистить? Тогда откуда берется ошибка?
Примечание:
delete [] str;
поменял, ничего не изменилось. Как только s - одна буква, вылетает.
Примечание:
Вот такая вот гадость выскакивает.
http://s005.radikal.ru/i212/1305/6c/86c3d97dcdad.jpg
Примечание:
Проблема в memset
char s1[] = "o";
int l1=strlen(s1);
char* str=new char[l1+1];
//...................
memset(str,0,l1+1);//работает
//...
memset(str,0,sizeof(str));//не работает
//...
memset(str,0,l1+2);//не работает (та же ошибка)
//..................
strcpy(str,s1);
delete [] str;
Собственно вопрос теперь состоит в том почему memset отрабатывает неверно при размере массива меньше трех?
Примечание:
Все разобрался!
sizeof(char)==1
sizeof(char *)==4
memset заполняет память на N количество элементов. Т.е в случае sizeof(char *) что эквивалентно sizeof(str) мы заполняем первые 4 элемента. Если же у меня массив меньше трех (меньше четырех с последним 0 включительно), то портится левая память. Мой компилятор на это отреагировал. А у некоторых пропустил мимо.
Правильным вариантом является memset(str,0,l1+1); в моем случае и memset(str,0,size*sizeof(type)); где type - тип массива (мне повезло что тип char == 1) а size - длинна массива.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.