LINUX.ORG.RU

Работа с указателями


0

0

Задача следующая - в функцию передается два параметра типа char* в функции они присваиваются элементам динамического массива char** data[2]. А дальше происходит фантастика: при выводе оказывается, что конец первой строки динамического массива нахлестывается на начало второй строки этого массива. участок кода:

*(data[0]+index) = new char;

*(data[0]+index) = _name;

*(data[1]+index) = new char;

*(data[1]+index) = _alias;

в чем дело может быть-то?

anonymous

Ты дважды пишешь в одно и то же место (сначала результат new, а потом значение _name, то же для _alias). В общем выучи язык, а то такой бредовый код стрёмно читать.

anonymous
()
Ответ на: комментарий от nil5

Да.

представленный код - это утро следующего рабочего дня(после бессонной ночи) в полном отупении и работе метода научного самотыка.

Вывод адресов этого массива таков:

data[0] | data[1]

0x804b0a0 | 0x804b0b0

0x804b0a4 | 0x804b0b4

0x804b0a8 | 0x804b0b8

0x804b0ac | 0x804b0bc

0x804b0b0 | 0x804b0c0

0x804b0b4 | 0x804b0c4

0x804b0b8 | 0x804b0c8

0x804b0bc | 0x804b0cc

0x804b0c0 | 0x804b0d0

anonymous
()

Что-то вообще ничего не понятно.

> в функцию передается два параметра типа char*

Значит, прототип выглядит примерно так:

void my_function(char *_name, char *_alias) ...

Да? Потом так:

char **data[2];
....
*(data[0]+index) = new char;
*(data[0]+index) = _name;
*(data[1]+index) = new char;
*(data[1]+index) = _alias; 

или, что то же самое, 

data[0][index] = new char;
data[0][index] = _name;
data[1][index] = new char;
data[1][index] = _alias; 

Вопрос такой: зачем "new char"? это что, выделяется место под один
байт? Зачем? Потом, в то же место, как справедливо заметил второй
анонимус, записывается адрес переданной строки.

Но даже так, если память для массива выделена правильно, никакого
нахлестывания не должно случиться... Я думаю, проблема кроется в
другом месте (которое нам не показали). Скорее всего, там тоже полно
таких же "new char" и немедленных присваиваний.

jek_
()
Ответ на: комментарий от jek_

А может, в реальном коде было так:

data[0][index] = new char;
strcpy(data[0][index], _name);

Ну вот в таком случа нахлестывание случится почти 100%.
Да еще и сегфолт впоследствии.

jek_
()
Ответ на: комментарий от jek_

Первоначальный код был таков:

int ConfContainer::add_alias( char *name, char *alias) {

*(data[0]+index) = name;

*(data[1]+index) = alias;

index++;

return 1;

}

Выставленный - это уже согласен гон дятла красноглазого Ж8(.

anonymous
()

Ж) си рулит..

anonymous
()
Ответ на: комментарий от jek_

Выше предоставлен вывод адресов элементов массива - там вторая половина первой строки имеет те же адреса, что и первая половина второй строки.

anonymous
()
Ответ на: комментарий от Dead

char **data - указатель на массив указателей char ***data - это вроде как еще указатель на всю эту беду (**data) ну а далее **data = new char[2] Или я не прав ?

nil5
()
Ответ на: комментарий от anonymous

> data[0] = new char*; data[1] = new char*;

В таком случае index должен быть равен 0. Если 0 <= index <= N,
то тогда инициализация должна быть 

data[0] = new char*[N+1];
data[1] = new char*[N+1];

Я так понимаю, что у тебя проблемы с пониманием того, как выделяется
память под массивы - почитай про операторы new[] и delete[].

jek_
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.