2010-08-03 3 views
0

Можно создать дубликат:
Why is this C code causing a segmentation fault?вина Сегментация приравнивая значение указателя обугленного в какой-то полукокса

char* string = "abcd"; 

теперь, когда я пытаюсь изменить некоторый характер этой строки я получаю ошибку сегментации

*string = 'p'; 

или

string[0] = 'p'; 
string[0] = 52; 

Может кто-нибудь объяснить мне причину, почему это происходит.

СООБЩЕНИЕ

Alok.Kr.

+0

http://stackoverflow.com/questions/3108832/write-permission-for-char – sinek

+0

Также [Различные выходы инициализации строки различное поведение?] (HTTP://stackoverflow.com/questions/1647273/different-string-initialization-yields-different-behavior) – caf

+0

Если это только C, то удалите тег C++, если это C++, попробуйте избежать имен типов в стандартной библиотеке, поскольку они может быть запутанным (т. е. не называть строки строк ') –

ответ

4

Если вы пишете char* string = "abcd";, строка «abcd» хранится в части статических данных вашей памяти, и вы не можете ее изменить.

И если вы напишите char* string = 'p';, это просто неправильно. Во-первых, вы пытаетесь объявить переменную с тем же именем (строка), и, что еще хуже, вы пытаетесь присвоить значение char переменной указателя char. Это не работает. То же самое: char[0] = 'p'; действительно ничего не значит для вашего компилятора, кроме синтаксической ошибки.

+0

жаль все опечатки, я предполагаю, что я был настолько сонным, что я напечатал все те вещи. –

+0

Хорошо. Так как я сказал «string [0] = 'p';" не может работать, потому что строка является статическими данными и доступна только для чтения. – Opera

2

Строковые литералы не подлежат модификации в C. Это задавали и отвечали много раз раньше, хотя его не так просто найти.

+3

Вот почему это хорошая привычка писать обугленного сопза * р = «привет» , а не символ * р = «привет» – bradgonesurfing

1

Если вы хотите изменить string, объявите его как массив, а не указатель на строковый литерал.

#include <stdio.h> 

int main() 
{ 
    char string[] = "hello world"; 
    string[0] = 'H'; 
    string[6] = 'W'; 

    printf("%s\n", string); 

    return 0; 
} 

Результаты в:

$ /tmp/hello 
Hello World 
Смежные вопросы