Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чём косяк? разница между char* и char[] 
:(
    Опции темы
cia
Дата 7.4.2016, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



Изучаю с++, поэтому вопрс может быть наивным...
Вот такой код:
Код

char* foo(int i) {
    char str[5];
    itoa(i,str,10);
    char* p=str;
//    return p=str;
    return str;
}

int main(int argc, char **argv) {
    char *s=foo(9);
    cout << s << endl;
    return 0;
}


В консоль пишет пустую строку. Но если расскоментировать "return p=str", то выводит "9". Объясните, пожалуйста, почему так, по моему представлению о мире результат должен быть одинаков.

Это сообщение отредактировал(а) cia - 7.4.2016, 00:40
PM WWW ICQ   Вверх
disputant
Дата 7.4.2016, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Что так, что эдак - так поступать нельзя: str - это локальный массив, создаваемый в стеке, и после выхода из функции его больше нет. Да, память может остаться не поврежденной (какое-то время) - но это как раз плохо - ошибка не сразу выплывет.

Словом, выводить из функции ссылки или указатели на локальные переменные категорически нельзя.

PM MAIL   Вверх
xvr
Дата 7.4.2016, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Вы вернули из функции foo указатель на локальную переменную, которая была разрушена при выходе из функции. Так что вам очень повезло, что
Цитата(cia @  7.4.2016,  00:38 Найти цитируемый пост)
Но если расскоментировать "return p=str", то выводит "9".


Добавьте слово static перед  char str[5];, будет работать

PM MAIL   Вверх
borisbn
Дата 7.4.2016, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(cia @  7.4.2016,  00:38 Найти цитируемый пост)
Изучаю с++,

а используете конструкции Си (кстати, в перемешку с Си++).
Пользуйтесь std::string для строк. И никаких "сырых" указателей.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 7.4.2016, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



На Си++ Ваш код выглядел бы так

Код
#include <iostream>
#include <string>
#include <sstream>

std::string foo( int i ) {
// С использованием С++11
    return std::to_string( i );
// Без использования С++11
    std::stringstream ss;
    ss << i;
    return ss.str();
}

int main()
{
    std::string s = foo( 9 );
    std::cout << s << std::endl;
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cia
Дата 9.4.2016, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



Большое спасибо за ответы, разобрался что к чему.
Что бы не плодить темы с подобного рода вопросами, задам ещё один тут...

Вот такой простенький код (всё лишнее убрал):
Код

class StringsWork {
private:
    char *_str;
public:
    StringsWork();
    StringsWork(char *s);
    void operator =(char *);
};

int main() {
//    StringsWork story("D");
    StringsWork story();
    story="У Лукоморья дуб зелёный;\n";
    return 0;
}


Если использовать первый конструктор (который закоментирован), то работает как надо. Но со вторым компилятор ругается:
assignment of function 'StringsWork story()'
cannot convert 'const char [26] to 'StringsWork()'

Мне не понятно поведение компилятора, разъясните, пожалуйста. Что это за приведение типа к StringsWork, ведь в обоих случаях должен "срабатывать" перегруженный оператор "=", которй ожидает параметр char* и который ничего не должен возвращать. Тоесть в строке
story="asdf";
Реального присвоения адреса не происходит, а происходит вызов метода "operator =". Разве нет?

Это сообщение отредактировал(а) cia - 9.4.2016, 13:47
PM WWW ICQ   Вверх
borisbn
Дата 9.4.2016, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(cia @  9.4.2016,  13:42 Найти цитируемый пост)
StringsWork story();

Это - объявление фунции, с именем story, которая возвращает StringsWork.
Это называется Most Vexing Parse



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cia
Дата 9.4.2016, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



Если честно, понятней не стало  smile 
Я пишу так:
Код

StringsWork *story=new StringsWork();

Теперь story - это StringsWork*. Но проблема всё та же, на этой строке:
Код

story="У Лукоморья дуб зелёный;\n";


Тут компилятор ругается, что не может привести const char* к StringsWork*, как будто не замечая перегруженный "operate =".
PM WWW ICQ   Вверх
xvr
Дата 9.4.2016, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(cia @  9.4.2016,  18:51 Найти цитируемый пост)
Если честно, понятней не стало

В языке есть правило - если что то похоже на объявление функции, то это и есть объявление функции. StringsWork story(); похоже на прототип (объявление) функции с именем story и без параметров, возвращающую экземпляр класса StringsWork. Т.е. это именно объявление функции, а не переменной story типа StringsWork с пустым списком параметров конструктора.

Цитата(cia @  9.4.2016,  18:51 Найти цитируемый пост)
Тут компилятор ругается, что не может привести const char* к StringsWork*, как будто не замечая перегруженный "operate =". 

Правильно ругается, и перегрузка не поможет - вы же перегрузили оператор для класса, а не для указателя на класс. Делайте так:
Код

*story="У Лукоморья дуб зелёный;\n";

PM MAIL   Вверх
cia
Дата 11.4.2016, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



Спасибо за разъяснение. При помощи поддержки гугла разобрался что к чему ))
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.