Действительно ли возможно изменить строку символа в C?

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

Это - то, что я попробовал:

char *a = "This is a string";
char *b = "new string";

a[2] = b[1]; // Causes a segment fault

*b[2] = b[1]; // This almost seems like it would work but the compiler throws an error.

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

Спасибо

Править:

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

62
задан 18 June 2009 в 12:58

2 ответа

Все - хорошие ответы, объясняющие, почему Вы не можете изменить строковые литералы, потому что они размещаются в постоянную память. Однако, когда нажатие прибывает в толчок, существует способ сделать это. Проверьте этот пример:

#include <sys/mman.h>
#include <unistd.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int take_me_back_to_DOS_times(const void *ptr, size_t len);

int main()
{
    const *data = "Bender is always sober.";
    printf("Before: %s\n", data);
    if (take_me_back_to_DOS_times(data, sizeof(data)) != 0)
        perror("Time machine appears to be broken!");
    memcpy((char *)data + 17, "drunk!", 6);
    printf("After: %s\n", data);

    return 0;
}

int take_me_back_to_DOS_times(const void *ptr, size_t len)
{
    int pagesize;
    unsigned long long pg_off;
    void *page;

    pagesize = sysconf(_SC_PAGE_SIZE);
    if (pagesize < 0)
        return -1;
    pg_off = (unsigned long long)ptr % (unsigned long long)pagesize;
    page = ((char *)ptr - pg_off);
    if (mprotect(page, len + pg_off, PROT_READ | PROT_WRITE | PROT_EXEC) == -1)
        return -1;
    return 0;
}

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

Hope это помогает.Удачи!

2
ответ дан 31 October 2019 в 13:14

Вы могли также использовать strdup:

   The strdup() function returns a pointer to a new string which is a duplicate of the string  s.
   Memory for the new string is obtained with malloc(3), and can be freed with free(3).

Для Вас пример:

char *a = strdup("stack overflow");
2
ответ дан 31 October 2019 в 13:14

Другие вопросы по тегам:

Похожие вопросы: