Преобразование указателя обратно в массив в C - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть функция *getText(), где конечным результатом является массив, который мне нужно вернуть из функции.Насколько я знаю, это невозможно напрямую, поэтому я создал указатель следующим образом:

char *ptr = &plainText[0];
return ptr;

Я все еще плохо знаком с C и не совсем комфортно работать с указателями, поэтомуЯ создал немного кода для преобразования указателя обратно в массив в функции, в которой он мне нужен:

int i;
char plainText[256];
for (i=0; *(getText()+i) == '\0'; i++){
    plainText[i] = *(getText()+i);
}

Идея в том, что цикл for будет проходить через строку, на которую указывает указатель, до тех пор, покаон находит конец ('\0') и для каждого символа добавляет строку.

Однако, хотя программа компилируется в gcc без ошибок компилятора, она завершается без ошибок времени выполнения, когда попадает в этот сегменткод.

Кто-нибудь может дать мне несколько советов, как заставить это работать?

Джеймс

Ответы [ 5 ]

3 голосов
/ 15 декабря 2011

Если вы внимательно об этом подумаете, вы увидите, что «преобразование указателя в массив» не имеет смысла .

Массив - это непрерывный блок памяти , которому вы дали имя .

Указатель - это память адрес .

Вы не можете преобразовать указатель в массив - как бы вы внезапно изменили адрес обратно в блок памяти? Вместо этого вам нужно будет создать новый блок и скопировать туда все, что вы хотите.

При условии, конечно, что первоначальный pointee существует в первую очередь. В вашем случае кажется, что это локальный массив, что означает, что он уничтожается при попытке скопировать его данные в другой массив.

1 голос
/ 15 декабря 2011

Это удивительно.Просто не делайте ничего, что вы делаете, отойдите назад, сделайте глубокий вдох ...

Функции C, которые должны возвращать массив, обычно делают это, просто принимая указатель и максимальный размер в качестве аргументови писать в это пространство.См., Например, strncat .

Все это копирование вперед и назад должно быть красным сигналом того, что что-то не так.:)

1 голос
/ 15 декабря 2011

Возможно, вы имели в виду *(getText()+i) != '\0', иначе ваше условие цикла всегда будет немедленно прекращено

0 голосов
/ 15 декабря 2011

Указатель на массив такой же, как указатель на первый элемент в массиве.Это просто значение адреса.

Итак

char ch [10];

ch совпадает с & ch [0]

Теперь вам не нужно ничего этого копироватьстрока с нулевым символом в конце.Просто используйте strcpy ()

0 голосов
/ 15 декабря 2011

Прочитайте хорошую книгу по программированию на Си. Вы узнаете, что массивы очень часто (но не всегда ) считаются указателями .

Возможно, вы не хотите вызывать getText() на каждой итерации, поэтому поместите его в переменную.

Ваш тест должен быть " отличным от нулевого символа ".

Компилировать со всеми включенными предупреждениями и для отладки. С gcc в Linux это означает gcc -Wall -g. Узнайте, как использовать отладчик, например gdb в Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...