Использование указателей для замены первого символа строки - PullRequest
2 голосов
/ 02 ноября 2019

Я вроде новичок в использовании указателей на C. Поэтому я пытался привыкнуть к ним. Поэтому я хотел поменять местами первый символ двух строк с помощью указателей. Это то, что я придумал

#include <stdio.h>

void swap_first_char(char *s1, char *s2) {
    char temp = *s1;
    *s1 = *s2;
    *s2 = temp;
}

int main() {
    char *str1 = "ASTRING";
    char *str2 = "BSTRING";
    swap_first_char(str1,str2);
    printf("str1 = %s, str2 = ‰s\n", str1, str2);
    return 0;
}

Итак, это мое понимание прямо сейчас. str1 и str2 содержат адрес первого символа «ASTRING» и «BSTRING». Поэтому, когда я передаю их в функцию swap_first_char(char*, char*);, теперь s1 содержит адрес первого символа строки «ASTRING», а s2 содержит адрес первого символа строки «BSTRING». Так что я могу разыменовать их и поменять местами, чтобы поменять местами первый символ обеих строк, верно?

Но я продолжаю получать ошибку сегментации при выполнении этого фрагмента кода. Если кто-то может сказать мне, почему это так, я был бы благодарен. Спасибо ^ _ ^

1 Ответ

1 голос
/ 02 ноября 2019

Расширяя это до ответа, где я могу использовать некоторый код: строковые константы - строки в кавычках - часто (но не обязательно) читаются только, и в некотором смысле это грязная уловка, что компилятор позволяет вам назначить один из нихна char * (что позволит вам писать в него) вместо const char * (что запретило бы).

Замена

char *str1 = "ASTRING";
char *str2 = "BSTRING";

на

char str1[] = "ASTRING";
char str2[] = "BSTRING";

действительно устраняет проблему (как проверено на моей системе x86 с gcc). В последнем случае компилятор выделяет полный массив строки (плюс байт NUL), тогда как в первом это просто указатель на байты, расположенные в другом месте.

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