2016-02-13 2 views
-1

Почему следующий код дает ошибку сегментации.Передача указателя в C

#include<stdio.h> 

void helper(char *i) { 
    printf("%c", *i); 
    *i = 't'; 
    printf("%c", *i); 
} 

void main() { 
    char *g = "t"; 
    helper(g); 
    printf("%c", *g); 

}

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

+0

Когда-либо слышал о форматировании и отступе? Используй это! И C не имеет конструктора копирования. Вы вызываете неопределенное поведение. Подумайте, на что указывает 'i'. – Olaf

+0

Какой конструктор копирования? Это [тег: C++]? И вы должны исследовать строковые литералы, ваш указатель 'g' указывает на один, и вы можете делать' * i = 't'', потому что это неопределенное поведение. –

+0

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

ответ

0

Поскольку g является строка символов, и вы пытаетесь изменить его внутри функции helper

char *g = "t"; // <-- this is string literal 

Изменение этого синтаксиса массива, и вы нормально

char g[] = "t"; 
+0

Первое предложение неверно. Указатель не является массивом (который в текстовом литерале становится в коде). – Olaf

+4

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

+0

@ 2501 - сделал это! – artm

0

Строка "t" помещается в только для чтения памяти. По историческим причинам вы можете использовать char *. Вместо этого сделайте

char g[] = "t"; 

Это создаст копию для чтения/записи в стеке.

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