30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
1

Порча указателя const char*

22.12.2016, 20:23. Показов 1085. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Может кто-нибудь сказать, какие действия потенциально могут привести к порче указателя const char*? Дело в том, что есть некоторые строки. Они поступают на обработку в метод класса, и по каким-то неведомым для меня причинам во время обработки часть указателей портятся - указывают не на начало строки, а, например, на середину. И соответственно отстаток полученной строки содержит мусор, а программа может завершится сбоем.
Код, к сожалению привести не могу, его нужно выдирать из приложения.
Если строки содержат \0 на конце, поверх них ничего не записывается, длины сохраняются, передаются в функции как const char*..., то что может приводить к подобным последствиям (по опыту)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2016, 20:23
Ответы с готовыми решениями:

Порча указателя при передаче в функцию
Добрый вечер. Проблема такая - при передаче в функцию структуры, полем которой является...

Чем отличаются объявления const char* и const* char
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как объявить: указатель...

Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]"
Вроде все правильно а все равно не работает. Подскажите в чем ошибка #include <iostream> ...

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).

8
Любитель чаепитий
3743 / 1799 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
22.12.2016, 20:37 2
Цитата Сообщение от [progeR] Посмотреть сообщение
порче указателя const char*?
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    const char* s = "Trololo";
    std::cout << s << "\n";
    ++s;
    std::cout << s;
}
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
22.12.2016, 20:41 3
Цитата Сообщение от [progeR] Посмотреть сообщение
Если строки содержат \0 на конце, поверх них ничего не записывается
ну собственно для этого он и придуман... если ваша "строка" не заканчивается нультерминальным символом, то это не строка, а массив символов и как результат, вы будете вылизать за приделы этого массива используя методы работы со строками., ну а как сдвинуть указатель, вам написали выше
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 02:43 4
Цитата Сообщение от [progeR] Посмотреть сообщение
передаются в функции как const char*
Это указатель на константу (через этот указатель нельзя изменить строку), но сам указатель не константный, его можно изменять. Передавай строки в функцию как const char * const (константный указатель на константу), если не скомпилируется, значит, описанная в теме, причина в том, что в функциях изменяются указатели.
C++
1
2
3
4
    const char* const s = "Trololo";
    std::cout << s << "\n";
    ++s; // ошибка
    std::cout << s;
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
23.12.2016, 10:05  [ТС] 5
Ясно, учту.
Заметил сейчас непонятную вещь: от компиляции к компиляции меняется результат вывода строк, хотя сам исходный код остается одним и тем же! Как такое возможно?

Скомпилировал, запустил - результат хороший.
Перекомпилировал, запустил - результат плохой!
Перекомпилировал, запустил - результат плохой!
Перекомпилировал, запустил - результат хороший...
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 10:21 6
Цитата Сообщение от [progeR] Посмотреть сообщение
Как такое возможно?
Без кода трудно сказать. Может UB присутствует.
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
23.12.2016, 10:36  [ТС] 7
Цитата Сообщение от nd2 Посмотреть сообщение
UB
Как расшифровывается?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
23.12.2016, 10:45 8
Цитата Сообщение от [progeR] Посмотреть сообщение
Как расшифровывается?
https://ru.wikipedia.org/wiki/... 0%B8%D0%B5
0
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 455
23.12.2016, 10:46 9
[progeR], undefined behavoir
0
23.12.2016, 10:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2016, 10:46
Помогаю со студенческими работами здесь

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *'
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context ...

Ошибка "значение типа "const char [81]" нельзя использовать для инициализации сущности типа "const unsigned char [61]"
Прошу помощи, так как раньше прога работала, сейчас решил вернуться и выдает ошибку: #pragma once...

Cannot convert 'const wchar_t *' to 'const char *'
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC...

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru