реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> c++ *указатель=*указатель
elusive
сообщение Apr 12 2011, 14:39
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



буду страшно благодарен коли кто знает подскажет... свои идеи кончились sad.gif

есть 2 указателя на char.
char *expression, *temp;

нужно по очереди присваивать значения строки expression строке temp, если это не пробел. делаю так:
while (*expression!='\0')
{
if (*expression!=' ') {*temp = *expression; temp++;}
expression++;
}

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

как грамотно скопировать значение ячейки памяти через указатели???
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 12 2011, 14:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А где у вас инициализация указателей явными значениями-то? В примере ни один из указателей не проинициализирован. laughing.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 12 2011, 14:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(elusive @ Apr 12 2011, 18:39) *
компилятор съедает, а в винде вылазит ошибка, что temp используется до того как был проинициализирован....

И правильно вылазит: temp - это указатель, начальное значение которого вы не определили. Присвоение "*temp =" посылает данные в неизвестность.
Go to the top of the page
 
+Quote Post
Idle
сообщение Apr 12 2011, 14:58
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Код
#include <stdio.h>
#include <stdlib.h>

static void elx_scp(char *dst, const char *src)
{
        while (*src)
                if ((*dst = *src++) != ' ')
                        dst++;
        dst = '\0';
}

int main()
{
        char *s0 = malloc(20);
        const char *s1 = "dead beaf cafe";

        elx_scp(s0, s1);
        puts(s0);
        exit(EXIT_SUCCESS);
}
Go to the top of the page
 
+Quote Post
elusive
сообщение Apr 12 2011, 15:26
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



Цитата(rezident @ Apr 12 2011, 20:43) *
А где у вас инициализация указателей явными значениями-то? В примере ни один из указателей не проинициализирован. laughing.gif


тот из которого переписываю (expression) указывает на строку.

Цитата(Idle @ Apr 12 2011, 20:58) *
Код
...

static void elx_scp(char *dst, const char *src)
{
        while (*src)
                if ((*dst = *src++) != ' ')
                        dst++;
        dst = '\0';
}

...
}



тот же результат: копирование символа происходит такой же операцией, то бишь *dst = *src++

Цитата(aaarrr @ Apr 12 2011, 20:44) *
И правильно вылазит: temp - это указатель, начальное значение которого вы не определили. Присвоение "*temp =" посылает данные в неизвестность.


хы... то есть всегда нужно память выделять temp = char new(80); ?



Сообщение отредактировал elusive - Apr 12 2011, 15:24
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 12 2011, 15:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(elusive @ Apr 12 2011, 19:26) *
хы... то есть всегда нужно память выделять temp = char new(80); ?

Не обязательно использовать именно new, но сам по себе указатель точно не инициализируется.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 12 2011, 15:40
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы можете хоть таким образом выделить память, на начало которой указывает указатель (прошу прощение за тавтологию), хоть другим (например, char temp[128]wink.gif. Главное запомните как следует на будущее, указатель всегда должен указывать на/внутрь существующий/-его объект/-а. Посему windows очень внятно вас за это нарушение отругал.
Go to the top of the page
 
+Quote Post
elusive
сообщение Apr 12 2011, 16:18
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



rezident, aaarrr, sergeeff, спасибо!! теперь запомню про инициализацию указателя.

все работает. я в общем сделал так:

char* temp_expression;
temp_expression = new char(strlen(expression));
...
*(temp_expression+i) = *expression;

i соответственно наращиваю.


p.s. Idle, у вас совсем не "говорящее" имя =)

upd хм странно, работает только если символов <=16...
upd лол какой-то...
если добавить не играющее большой роли printf

str = new char(strlen(expression));
printf("%d\n", strlen(expression));

работает с любой длиной %)))))

Сообщение отредактировал elusive - Apr 12 2011, 16:38
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 12 2011, 16:56
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(elusive @ Apr 12 2011, 20:18) *
rezident, aaarrr, sergeeff, спасибо!! теперь запомню про инициализацию указателя.

все работает. я в общем сделал так:

char* temp_expression;
temp_expression = new char(strlen(expression));
...
*(temp_expression+i) = *expression;

i соответственно наращиваю.


p.s. Idle, у вас совсем не "говорящее" имя =)

upd хм странно, работает только если символов <=16...
upd лол какой-то...
если добавить не играющее большой роли printf

str = new char(strlen(expression));
printf("%d\n", strlen(expression));

работает с любой длиной %)))))

А это все от того, что полезно самому книжки читать, а не только на советы надеятся.

Что делает
Код
char *pp = new char(80);


выделяет 1 байт в куче и инициирует его значением 80.

Вы ведь совсем другого хотели, не правда ли? Вам надо выделить область памяти длиной 80 байт. Тогда это так:

Код
char *pp = new char[80];


Потому и не работает.
Go to the top of the page
 
+Quote Post
elusive
сообщение Apr 13 2011, 02:49
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



Цитата(sergeeff @ Apr 12 2011, 22:56) *
А это все от того, что полезно самому книжки читать, а не только на советы надеятся.

Что делает
Код
char *pp = new char(80);


выделяет 1 байт в куче и инициирует его значением 80.

Вы ведь совсем другого хотели, не правда ли? Вам надо выделить область памяти длиной 80 байт. Тогда это так:

Код
char *pp = new char[80];


Потому и не работает.


да, да. полностью согласен.
на счет скоб сам себя запутал.
искренне балгодарен, sergeeff
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 08:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016