2013-08-03 6 views
-1

Я пытался понять ошибку сегментации для голец * присваивания во время для следующей программы на место * р = «Z»ошибка Сегментация полукокса * Назначение

void main() 
{ 
    char *p ="abcdefg"; 
    *p = 'Z'; 
} 

Когда Googled, я нашел много ссылок на ответы следующим образом: 1. Это строковый литерал, и после присвоения его значение не может быть изменено. 2. Строковые литералы нельзя присваивать * p 3. Возьмите malloc, который может быть изменен ... и так далее ...

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

-Prashanth

+1

Посмотрите: http://stackoverflow.com/questions/718477/string-literals – loxxy

+0

Предполагаю, что вы слышали, что строковые литералы часто называются строковыми константами. Какую часть слова «постоянный» вы не понимаете? –

+0

Используется ли такая же строковая буквальная буква для целых чисел? #include void main() { int * a = 123456; * a = 1; } – pkumarn

ответ

1

Это неопределенное поведение. Если у вас есть постоянная строка, Стандарт говорит, что строковые литералы не могут быть изменены. Таким образом, он доступен для записи или не зависит от архитектуры, и может, или не может быть segfault.

обновление добавлено с комментария.

+0

«он помещен в сегмент данных» также зависит от архитектуры, не делайте предположений. «Это неопределенное поведение» само по себе достаточно; вероятно, добавьте ", потому что Стандарт говорит, что строковые литералы не могут быть изменены" для еще лучшего ответа. –

+0

@ H2CO3, я обновил свой ответ. – Devolus

+0

Я вижу, спасибо. –

-1

Это потому, что вы используете * для назначения. Ваш код в основном читает: по адресу p, который имеет тип pointer значение магазина Z, которое имеет тип char.

+1

«По адресу p, который имеет тип указателя» - за исключением того, что это не так, '* p' разделяет указатель p, поэтому присваивание пытается изменить значение первого символа, которое не следует изменять, поскольку оно часть строкового литерала. –

0
char *p ="abcdefg";// p is pointing a read only memory. 
    *p = 'Z';  //You want write a read memoty . 
+0

Неправильно. «abcdefg» хранится где-то в памяти. '* p' является указателем на этот адрес. – ep0

+2

@ ep0 Нет, это ваше объяснение, что это неправильно. Оператор '*' разыгрывает указатель. –

0

первым * является переменной для точки, это означает, что р является точкой, которая указывает на полукокса, так что ИНТ * р является точкой, которая указывает на целочисленное значение, это переменная для точки. p, not * p, является точкой, ее значением является адрес значения char в памяти, вы можете проверить его с помощью printf («p =% d», p); p содержит значение * p или переменную char. поэтому вы можете сказать * = "значение, указанное указателем ...", и & = "адрес значения ... в памяти". поэтому вместо char * p, temp; Temp = 'A'; * p = temp; (значение, которое указатель p указывает равное значение переменной temp)

Смежные вопросы