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

в чем дело? - C++

Восстановить пароль Регистрация
 
 
demondy
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 8
27.03.2013, 12:48     в чем дело? #1
может кто объяснит в чем дело?
просто заметил одну особенность, если temp <=8 символам (не считая нулевого в конце), то t выводит с двумя левыми символами в конце, если >8 символов, то всё выводит как надо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
void fun(char* p)
{
 char * temp="12345678";
 while (*temp)
  *p++=*temp++;
};
int main()
{
   char* t="asdf";
   fun(t);
   cout << t << endl;
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2013, 12:48     в чем дело?
Посмотрите здесь:

небольшая ошибка в чем дело? C++
C++ не пойму в чем дело
Компилятор выдаёт ошибку, в чем дело?? C++
Ни как не разберусь в чем дело... C++
getline() в чем дело C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2013, 12:50     в чем дело? #2
Цитата Сообщение от demondy Посмотреть сообщение
char* t="asdf";
- ОМГ ну память выделена в лиетрале под 4 символа, а в своей функции пробуешь закопипастить 8
Цитата Сообщение от demondy Посмотреть сообщение
temp="12345678";
- слышал когда-нибудь о размерах блоков памяти, ошибки сегментации ит.д?
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
27.03.2013, 12:51     в чем дело? #3
Простите, что вы хотите, чтобы эта функция делала?
demondy
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 8
27.03.2013, 12:52  [ТС]     в чем дело? #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ОМГ ну память выделена в лиетрале под 4 символа, а в своей функции пробуешь закопипастить 8 - слышал когда-нибудь о размерах блоков памяти, ошибки сегментации ит.д?
оно понятно, просто интересно, почему если больше 8 символов, то все как надо работает

Добавлено через 50 секунд
Цитата Сообщение от eocron Посмотреть сообщение
Простите, что вы хотите, чтобы эта функция делала?
собственно говоря ничего.. так просто заметил случайно
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.03.2013, 12:53     в чем дело? #5
demondy, http://www.cyberforum.ru/blogs/18334/blog97.html
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2013, 13:00     в чем дело? #6
Цитата Сообщение от demondy Посмотреть сообщение
оно понятно, просто интересно, почему если больше 8 символов, то все как надо работает
- да потому что у t тогда память выделена под большее число символов чем у
Цитата Сообщение от demondy Посмотреть сообщение
char * temp="12345678";
вот и всё, напиши в своём p 15 символов и попробуй скопировать в которой их будет 10.

Не по теме:

Для 8-ми символов...

demondy
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 8
27.03.2013, 13:06  [ТС]     в чем дело? #7
В общем, вопрос получается не в том, почему это не работает, а в том почему это работает...

спасибо всем!!

тема закрыта
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2013, 13:13     в чем дело? #8
demondy, Во!Вот тебе пример чтобы понял какую ерунду ты посчитал за истину
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
void fun(char* p)
{
    char * temp= (char *)"String with length more than 10 symbols";
    while (*temp)
        *p++=*temp++;
}
int main()
{
    char * t = (char *)"0123456789";
    fun(t);
    cout << t << endl;
    return 0;
}
Цитата Сообщение от demondy Посмотреть сообщение
росто интересно, почему если больше 8 символов, то все как надо работает
- смотри
http://codepad.org/QMlrsEzA
Output:
Segmentation fault
Добавлено через 3 минуты
Цитата Сообщение от demondy Посмотреть сообщение
В общем, вопрос получается не в том, почему это не работает, а в том почему это работает...
спасибо всем!!
тема закрыта
- возможно код тебя отрезвит, не работает вообще. На пальцах
В блоке p памяти на 8 символов + нуль-терминатор
В блоке t с четырмя символами памяти под 4ри символа + нуль-терминатор
Когда блок t большей длинны чем 8 символов, то копирование возможно. Скажем в t 9 символов + нуль терминатор - всё скопируется ок, а теперь в p подставь мою строку
(char *)"String with length more than 10 symbols"; а в t оставь 9-ть, и погляди что будет.
Ну что тут неясного?!

Добавлено через 9 секунд
Цитата Сообщение от demondy Посмотреть сообщение
В общем, вопрос получается не в том, почему это не работает, а в том почему это работает...
спасибо всем!!
тема закрыта
- возможно код тебя отрезвит, не работает вообще!
На пальцах
В блоке p памяти на 8 символов + нуль-терминатор
В блоке t с четырмя символами памяти под 4ри символа + нуль-терминатор
Когда блок t большей длинны чем 8 символов, то копирование возможно:
Скажем в t 9 символов + нуль терминатор, а в р - 8-мь + нуль терминатор - всё скопируется ок!А теперь в p подставь мою строку
(char *)"String with length more than 10 symbols"; а в t оставь 9-ть, и погляди что будет. (Подсказка Segmentation fault)
Ну что тут неясного?!
demondy
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 8
27.03.2013, 13:16  [ТС]     в чем дело? #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Segmentation fault
у меня этот код работает
может мне нужно компилятор поменять BC++ 5.02 - еще со времен универа остался
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2013, 13:22     в чем дело? #10

Не по теме:

Цитата Сообщение от demondy Посмотреть сообщение
у меня этот код работает
может мне нужно компилятор поменять BC++ 5.02 - еще со времен универа остался
- Да в дебуге работает всё и даже ошибки!
Скомпилируй релиз версию!
Фуух ты мне напоминаешь меня в сааамом начале - "когда хоть кол на голове теши, вбил в себе в голову и пока на пузе не проползёшь никто дурь из головы не выбьет..."
Дело не в том что работает в режиме Debug, дело в том что в реальном exe без
try блоков, трассировок, которые любезно предоставляет нам дебуг - твой код упадёт с большой горы из-за Segmentation faul!!!Высказался я наконец-то!



Добавлено через 2 минуты
demondy, Линк на кодпад это линк на компилятор в стандрате который показывает как реально будет развиваться работа программы - так понятней почему код не работоспособен?
demondy
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 8
27.03.2013, 13:28  [ТС]     в чем дело? #11
ОК, ошибка понятна была изначально, просто думаю мало ли. Так делать не буду

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Линк на кодпад это линк на компилятор в стандрате который показывает как реально будет развиваться работа программы - так понятней почему код не работоспособен?
про это не знал, спасибо за инфу..

СПАСИБО
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2013, 13:34     в чем дело? #12
Цитата Сообщение от demondy Посмотреть сообщение
BC++ 5.02 - еще со времен универа остался
- Ниже скриншот из VisualStudio 6.0 (компилятор остался у меня с института и выпущен аж в 99-году), вот смотри пошаговое прохождение

В добавок давай немножко модернезируем твой код (как видишь я ничего не менял) просто явно разнёс блоки и вылетит сей код на втоём компиляторе даже в Debug-е я уверен почти на 100%
http://codepad.org/S77HSfWZ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
void fun(char* p, char * temp)
{
    while (*temp)
        *p++=*temp++;
}
int main()
{
    char * t = (char *)"0123456789";
        char * temp = (char *)"String with length more than 10 symbols";
    fun(t, temp);
    cout << t << endl;
    cin.get();
    return 0;
}
Миниатюры
в чем дело?   в чем дело?  
-=ЮрА=-
27.03.2013, 13:37
  #13

Не по теме:

Цитата Сообщение от demondy Посмотреть сообщение
про это не знал, спасибо за инфу..
СПАСИБО
- выше постил до того как увидел что ты меня услышал
Цитата Сообщение от demondy Посмотреть сообщение
Так делать не буду
- мудрое решение!

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.03.2013, 13:38     в чем дело? #14
Цитата Сообщение от demondy Посмотреть сообщение
оно понятно, просто интересно, почему если больше 8 символов, то все как надо работает
потому что памяти хватает.
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2013, 13:38     в чем дело? #15
demondy, тут смотри - сама коснтрукция
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while (*temp)
* * * * *p++=*temp++;
- вполне оправдана и работоспособна, но только надо чтобы блок р имел памяти не меньше чем блок temp - тогда всё будет гуд!Это я к тому что сам цикл юзать можешь, только заботься чтобы не было сигфолта и всё будет ок
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.03.2013, 13:42     в чем дело? #16
ТСу срочно читать "хакинг. искусство эксплойта".
demondy
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 8
27.03.2013, 13:45  [ТС]     в чем дело? #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вылетит сей код на втоём компиляторе даже в Debug-е я уверен почти на 100%
Работает...
output: "String with length more than 10 symbols 10 symbols"

Последний вопрос: "Если на кодепад выдает правильный output, а у меня не такой, то это значит что мой компилятор устарел?"

Добавлено через 43 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
но только надо чтобы блок р имел памяти не меньше чем блок temp
Это понятно...
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.03.2013, 13:49     в чем дело? #18
Цитата Сообщение от demondy Посмотреть сообщение
Это понятно...
Тогда о чём тема?
demondy
0 / 0 / 0
Регистрация: 27.03.2013
Сообщений: 8
27.03.2013, 13:50  [ТС]     в чем дело? #19
Последний вопрос: "Если на кодепад выдает правильный output, а у меня не такой, то это значит что мой компилятор устарел?"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2013, 13:59     в чем дело?
Еще ссылки по теме:

не могу понять в чем дело C++
В чем дело? C++
C++ Пятиминутное дело!В чем ошибка?

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
27.03.2013, 13:59     в чем дело? #20
Цитата Сообщение от demondy Посмотреть сообщение
Последний вопрос: "Если на кодепад выдает правильный output, а у меня не такой, то это значит что мой компилятор устарел?"
- твой компилятор выдаёт в режиме отладки или режиме Release? По поводу компилятора надо смотреть его суппорт, думаю для ВС 5.2 его можно отыскать в гугле
Yandex
Объявления
27.03.2013, 13:59     в чем дело?
Ответ Создать тему
Опции темы

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