Я боролся в течение нескольких часов со всеми видами учебных руководств 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.
Таким образом, там какой-либо путь состоит в том, чтобы изменить значения в строках, а не адресах указателя?
Спасибо
Править:
Спасибо все для Ваших ответов. Это имеет больше смысла теперь. Это особенно имеет смысл, почему иногда это хорошо работало и другие времена, не работающие. Поскольку иногда я передавал бы символьный указатель, и другие времена массив символов (массив символов хорошо работал).
Все - хорошие ответы, объясняющие, почему Вы не можете изменить строковые литералы, потому что они размещаются в постоянную память. Однако, когда нажатие прибывает в толчок, существует способ сделать это. Проверьте этот пример:
#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 это помогает.Удачи!
Вы могли также использовать 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");