Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83

Объясните поведение char*

12.07.2018, 14:30. Показов 710. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему крашится эта функция при выполнении? Крашится во втором цикле while, на строчках
C++
1
2
*to = *from;
to++;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void some_func(char *to, const char *from)
{
    char *temp = to;
 
    while(*to != 0)
        to++;
 
    while(*from != 0)
    {
        from++;
        *to = *from;
        to++;
    }
    *to = 0;
}
Компилировал в QT Creator с использованием mingw, консольный проект без использования библиотек QT. При запуске крашится с сообщением "Прекращена работа программы".
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2018, 14:30
Ответы с готовыми решениями:

Различное поведение функции которая копирует строки с char* t и char t[]
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

Stack. Объясните поведение
Имеется класс реализующий стек #include<iostream> const long nullValue = -32766; template<typename T> class MyStack {...

Объясните непрогнозируемый результат переполнение типа char
Есть тип char с диапазоном значений До 255 значения выводятся адекватно. От 256 до 383 выводит положительные числа n-255. Почему? ...

6
Заблокирован
12.07.2018, 14:35
Цитата Сообщение от vglv Посмотреть сообщение
*to = *from;
to++;
так свободно по оперативке бегать и мусорить? !*from когда настанет?
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
12.07.2018, 14:39
vglv, проверьте, что размера массива to хватает для объединенных данных двух массивов (не забывая о терминальном нуле). Так же проверьте, что массивы правильно инициализированы перед вызовом функции.

Цитата Сообщение от vglv Посмотреть сообщение
C++
1
2
from++;
 *to = *from;
Если ваша функция соединяет строки, то эти две строки надо поменять местами.
1
31 / 26 / 26
Регистрация: 04.04.2018
Сообщений: 83
12.07.2018, 14:42  [ТС]
Biger18, надеюсь, я правильно понял:

Если я создаю переменную char* s = "12345", то выделяется память строго под 6 символов (12345 и терминальный нуль). Используя s как указатель, я могу прочесть память за пределами этого массива из 6 символов, но записать что-то за пределы этого массива я не могу, так как память защищена от записи.
0
Заблокирован
12.07.2018, 14:45
скорее всего сможете, но влезете в другие данные
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
12.07.2018, 15:08
Цитата Сообщение от vglv Посмотреть сообщение
Используя s как указатель, я могу прочесть память за пределами этого массива из 6 символов, но записать что-то за пределы этого массива я не могу, так как память защищена от записи.
Прочесть тоже не сможете. Получите либо вылет с ошибкой, либо мусор. Но у вас все правильно написано, только убедитесь, чтобы соблюдались условия, о которых я выше писал.

Добавлено через 22 минуты
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
#include <iostream>
 
using namespace std;
 
void some_func(char *to, const char *from)
{
    while (*to != 0)
        to++;
 
    while (*from != 0)
    {
        *to = *from;
        from++;
        to++;
    }
    *to = 0;
}
 
int main()
{
    char a[7] = "abc"; // 3 + 3 + 1
    char b[4] = "def"; // 3 + 1
    some_func(a, b);
    cout << a << endl;
 
    system("pause");
    return 0;
}
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
12.07.2018, 15:51
Цитата Сообщение от vglv Посмотреть сообщение
Biger18, надеюсь, я правильно понял:
Если я создаю переменную char* s = "12345", то выделяется память строго под 6 символов (12345 и терминальный нуль). Используя s как указатель, я могу прочесть память за пределами этого массива из 6 символов, но записать что-то за пределы этого массива я не могу, так как память защищена от записи.
вы и в пределах этого массива ничего не сможете записать, он у вас и при записи в предела массива скорее всего крашнется, ибо единственно правильное объявление это
C++
1
const char* s = "12345"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.07.2018, 15:51
Помогаю со студенческими работами здесь

Объясните, почему указатель на char - не возвращает адрес?
Объясните, почему указатель на char - не возвращает адрес? Должна же работать как int , не? Создал массив из 3 элементов - но как...

Объясните где я косяк (switch case + char)
Доброе время суток! Имеется: for (unsigned int i=0; i&lt;v.size(); ++i) { cout &lt;&lt;&quot;# &quot;&lt;&lt;v.number ...

Объясните как правильно сравнить переменные типа char
Испульзую (strcmp(a.StNazn,c)==0) Не работает. Если поменять на (strcmp(a.StNazn,c)&lt;0) Работает, но как-то не правильно. ...

Странное поведение char при выводе в Edit
void __fastcall TForm1::Edit2Change(TObject *Sender) { char s; AnsiString s1; if(Edit2-&gt;Text != &quot;&quot;) { s1 = Edit2-&gt;Text; ...

Объясните поведение модели ОУ
Я использую TINA-TI. Добавил вручную новый компонент ОУ AD8027, файлы описания скачал с официального сайта. При простом подключении +-5V...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru