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

указатели - C++

Восстановить пароль Регистрация
 
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
13.05.2012, 14:06     указатели #1
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
29
30
31
32
33
34
35
#include "stdafx.h"
#include "conio.h"
#include "iostream"
#include "string"
 
using namespace std;
 
char *getname(void);
 
int _tmain(int argc, _TCHAR* argv[])
{
    char *pt1="";
    pt1=getname();
    //cout<<*pt1;
           cout<<pt1<<endl;
    char *pt2=getname();
    cout<<"\t"<<pt2<<endl;
    //cout<<pt1;
    getch();
    return 0;
}
 
char *getname(void)
{
    char A[20];
    char *ps; // знаю что не инициализирован но в коментариях был вариант
    //char *ps=new char[20];
    //char *ps=A;
    cin>>A;
    //strcpy(ps,A);
    ps=A;
    cout<<A<<"\t"<<ps;
    cout<<(int*)A<<"\t"<<(int*)ps;
    return ps;
}
собственно вопрос - я знаю как написать эту программу но интересно разобраться что не так, то есть понять указатели со строками
указатель на строку возвращает адресс 1го элемента
в функции через cout строку печатает в main нет
но *pt1 выдает правильный 1 элемент, просто pt1 выдает что-то непонятное
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 14:06     указатели
Посмотрите здесь:

C++ Указатели
Указатели.... C++
C++ Указатели
Указатели C++
Указатели. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
13.05.2012, 15:06     указатели #2
В функции getname(void) создаётся локальный массив символов и указатель на него, => после выхода из функции массив уничтожается и указатель указывает на пустую область памяти, т.е. на "что-то непонятное". Правильный код (с немного другим форматированием):
C++
1
2
3
4
5
6
7
8
9
10
char *getname(void)
{
    char* A = new char[20];
    char *ps;
    cin>>A;
    ps=A;
    cout<<A<<"\t"<<ps<<"\t";
    cout<<(int*)A<<"\t"<<(int*)ps<<endl;
    return ps;
}
При вводе "test", у меня программа выводит:
C++
1
2
3
4
test
test    test    0x3e24b0    0x3e24b0
test
t
Кстати, в этом случае нужно вручную уничтожить память, выделенную с помощью оператора new.
Aliru777
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 71
13.05.2012, 19:47  [ТС]     указатели #3
тo есть это автоматич хранилище и после все затирается?
вопрос почему при вызове сиаут*гетнейм выдает правильный 1й элемент - или это мусор из памяти?
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
15.05.2012, 15:43     указатели #4
Цитата Сообщение от Aliru777 Посмотреть сообщение
тo есть это автоматич хранилище и после все затирается?
Именно.
вопрос почему при вызове сиаут*гетнейм выдает правильный 1й элемент - или это мусор из памяти?
Немного не понял вопроса. Если в функции реализация выглядит как
C++
1
char* A = new char[20];
, то в возвращаемой переменной практически никогда не окажется мусор из незанятой памяти.
Кстати, в вашей первоначальной версии, где
C++
1
 char A[20];
при вызове
C++
1
cout << *(getname());
у меня вообще не компилируется
Yandex
Объявления
15.05.2012, 15:43     указатели
Ответ Создать тему
Опции темы

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