Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: c++ *указатель=*указатель
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
elusive
буду страшно благодарен коли кто знает подскажет... свои идеи кончились sad.gif

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

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

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

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

И правильно вылазит: temp - это указатель, начальное значение которого вы не определили. Присвоение "*temp =" посылает данные в неизвестность.
Idle
Код
#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);
}
elusive
Цитата(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); ?

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

Не обязательно использовать именно new, но сам по себе указатель точно не инициализируется.
sergeeff
Вы можете хоть таким образом выделить память, на начало которой указывает указатель (прошу прощение за тавтологию), хоть другим (например, char temp[128]wink.gif. Главное запомните как следует на будущее, указатель всегда должен указывать на/внутрь существующий/-его объект/-а. Посему windows очень внятно вас за это нарушение отругал.
elusive
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));

работает с любой длиной %)))))
sergeeff
Цитата(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];


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

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


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

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

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


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


да, да. полностью согласен.
на счет скоб сам себя запутал.
искренне балгодарен, sergeeff
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.