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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Woloc Graube
0 / 0 / 0
Регистрация: 09.02.2013
Сообщений: 18
#1

Нужна консултация с указателем char * в потоке - C++

22.07.2013, 19:13. Просмотров 315. Ответов 6
Метки нет (Все метки)

Вот, собственно, начал учить структуры. Чуток сам разбирался с указателями, но не до конца все понял.
В общем, есть код:

...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct client
{
    char *name;
    char *first_name;
    int years;
}bbb;
 
int main(void)
{
    cout << "Enter your name >" << endl;
    cin >> bbb.name;
        cout << bbb.name << endl;
    _getch();
}
...

Программа в конце завершается ошибкой: invalid NULL pointer.
Понятно, что все будет работать, если записать вместо "char *name" "char name[]" но здесь же как-то через указатели все лепится. Я так понимаю, вместо самой строки в поток записывается адрес?
Можете подсказать, как грамотно писать такие вот штуки?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2013, 19:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужна консултация с указателем char * в потоке (C++):

Операции с указателем к char[] - C++
Есть некая структура, например WNDCLASSA, где её члены: typedef struct tagWNDCLASSA { UINT style; WNDPROC ...

В чем разница между указателем и указателем на указатель? - C++
int x, *p, *q; x=10; p=&amp;x; q=p; cout&lt;&lt;*q; int x, *p, **q; x=10; p=&amp;x; q=&amp;p;

Переделать функцию c указателем на int, на функцию с указателем на void - C++
Есть рабочий код qsort для int: void qsort(int *base, int n) { // Прекратить если количество элементов меньше либо равно единице....

Не могу создать поток( Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке) - C++
хм.. не могу создать поток в c++ и направить туда. Нужно чтобы функция запускается в потоке и работала там пока не закроем в потоке.

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь( - C++
Всем доброго дня! У меня такая проблемка.... написал программу, но сначала она ругалась на Cannot convert char* to char теперь вроде...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
22.07.2013, 19:16 #2
Woloc Graube, в вашей структуре память под указатель не выделяется.
Попробуйте так
C++
1
2
3
4
5
6
struct client
{
    char name[80];
    char first_name[80];
    int years;
}bbb;
Woloc Graube
0 / 0 / 0
Регистрация: 09.02.2013
Сообщений: 18
22.07.2013, 19:21  [ТС] #3
akk, а если писать через указатель? Разве не будет написание "char *name;" создавать переменную и от нее по ее адресу дальше записывать всю строку?
Значит я вообще тогда в указателях не разобрался.
akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
22.07.2013, 19:27 #4
Woloc Graube, вот еще посмотрите
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <cstring>
struct client
{
    char *name;
    char *first_name;
    int years;
} bbb;
using namespace std; 
const int SIZE = 1024;
int main(void)
{
    char BUF[SIZE];
    cout << "Enter your name >" << endl;
    cin >> BUF;
    bbb.name = new char[strlen(BUF)+1];
    strcpy(bbb.name, BUF);
    cout << bbb.name << endl;
    cin.get();
}
Добавлено через 3 минуты
Цитата Сообщение от Woloc Graube Посмотреть сообщение
Разве не будет написание "char *name;" создавать переменную и от нее по ее адресу дальше записывать всю строку?
чтобы в указатель записать данные, нужно выделить сначала память (оператор new (16строчка в моем коде)).
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
22.07.2013, 19:34 #5
Woloc Graube, указатель - это переменная, в которой записан адрес. в сам указатель нельзя записать строку. можно динамически выделить память под строку и адрес начала этой строки присвоить указателю
Woloc Graube
0 / 0 / 0
Регистрация: 09.02.2013
Сообщений: 18
22.07.2013, 19:43  [ТС] #6
akk, нет, так возьни слишком много
Первый вариант мне больше понравился. Спасибо огромное.
А не знаете, где и в чем можна попрактиковаться с указателями?
akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
22.07.2013, 19:54 #7
Цитата Сообщение от Woloc Graube Посмотреть сообщение
А не знаете, где и в чем можна попрактиковаться с указателями?
Если нужны именно задания то почитайте главы по указателям в книге "Б.Керниган, Д. Ритчи: Язык программирования C", там в конце главы должны быть задания. А вообще по развивайте далее этот ваш код, например сделайте класс с несколькими конструкторами и по выделяете память указателям и т д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 19:54
Привет! Вот еще темы с ответами:

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Сделать преобразование unsigned char в char, а затем типу int - C++
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

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

array char* to char* (значения массива указателей в один указатель) - C++
Как сложить(или вывести в формате char*) все значения массива указателей(char *) воедино, то есть сложить строки и назначить результату...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.07.2013, 19:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru