В C, я могу сохранить строки как char *, а затем использовать указатели для указания на другие строки? - PullRequest
0 голосов
/ 11 марта 2011

Если я создаю строку вроде

char string[6] = "hello";
char* ptr = (char*) malloc(sizeof(string));
strcpy(ptr, string);

и затем я делаю это:

char* ptr2 = ptr;

это будет работать?

Как правило, если у меня есть указатель char * на строку, могу ли я сделать так, чтобы другие указатели указывали на эту строку, а начальный указатель на другую строку?

[РЕДАКТИРОВАТЬ]

Спасибо за ваш отзыв, но я немного запутался. Я постараюсь взять вещи с самого начала.

  1. У меня есть основное, в котором я делаю scanf для чтения строки, которая не имеет фиксированный размер, но имеет максимальную длину. Я читаю это так char* input; scanf("%as", &input);. Я думаю, что флаг 'a' автоматически выделяет необходимую память для размещения строки.

  2. Затем я должен вызвать функцию foo(char* s), которая принимает строку в качестве ввода.

  3. Внутри этой функции я должен сохранить строку в памяти. У меня есть два варианта: либо использовать параметр, либо создать новый malloc и strcpy и использовать новую строку. Какой из двух является правильным? Мне просто нужно сохранить ячейку в памяти и обратиться к ней позже.

  4. Если я использую параметр и сохраняю где-то его место в памяти, это безопасно или из-за того, что указатель на строку постоянен, это вызовет какие-либо проблемы? Решит ли создание другой строки с помощью malloc что-то или это то же самое?

До сих пор я пробовал несколько комбинаций, но не мог добиться того, чего хотел. Любая помощь приветствуется.

1 Ответ

5 голосов
/ 11 марта 2011
char[6] string = "hello";

не будет работать вообще. Вы имеете в виду char string[] = "hello";

И да, вы можете иметь указатели псевдоним друг на друга, то есть указывать на один и тот же буфер. Будьте осторожны, чтобы вы не free оба из них, хотя, или использовать любой из указателей псевдонимов после того, как один из них был free 'd.

Это, на самом деле, очень полезно. Рассмотрим типичную реализацию strcpy, которая должна возвращать свой первый аргумент:

char *strcpy(char *dest, char const *src)
{
    char *p = dest;  // aliasing pointers
    while (*src != '\0')
        *p++ = *src++;
    return dest;
}

И да, после char *p2 = p1 вы можете указать p1 на другой буфер, но это в основном полезно в алгоритмах хитрых указателей. Опять же, будьте осторожны с распределением памяти.

...