2012-10-13 5 views
0

가능한 중복 : 나는 포인터를 가지고 있고이 두 문자의 인덱스를 알고 있다면, 나는 문자를 교환 얼마나 (I didn를
Why do I get a segmentation fault when writing to a string?스왑 문자

't은 실제로

char *str = "hello") 배열을 할당하고 내가 알고 I 인덱스 0과 4 인 'h'와 'o'를 바꾼 다음 포인터도 반환하려고합니다.

당신은 문자열 리터럴에 포인터,

temp = array[i]; 
array[i] = array[j]; 
array[j] = temp; 
+0

당신이 묻는 것은 명확하지 않습니다. – MByD

답변

1

다음 선언 :

char *str = "hello"; 

가 안전하지 않은 행동에 대해 경고하기 위해해야합니다

const char *str = "hello"; 

문자열 litteral을 수정하려는 시도가 정의되지 않은 동작은 C 표준에 따라이기 때문에, 당신은해야 오히려 배열을 사용하십시오.

char str[] = "hello"; 

그런 다음, 배열의 요소가 쉽고 안전 스왑 :

char tmp = str[0]; 
str[0] = str[4]; 
str[4] = tmp; 
1
temp = array[i]; 
array[i] = array[j]; 
array[j] = temp; 
+0

하지만 char [] s = { 'h', 'e'....}라고 말한 적은 없습니다. 내가 어떻게 그렇게 할 수 있니? –

+0

char * foo = "bar"; char foo [] = { 'b', 'a', 'r', '\ 0'}와 같습니다. – Nico

+2

평등하지 않습니다. 다른 유형, 다른 행동. –

3

음의 규칙을 수행하지 않을 수 있습니다 사용 해요. 리터럴은 변경할 수 없습니다. 네가 항상 해왔 던 방식대로 붙어 라.

+0

그래서 문자열 리터럴에 대한 포인터를 char 배열에 복사해야합니까? –

+0

그래, 그리고 당신은 그것을 바꿀 수있다. 너 해봤 니? 당신은 segfault를 얻어야했습니다. –

+0

정확히 seg 결함이있어, 그 이유는 혼란 스러웠습니다! –

0

일부 운영 체제/컴파일러는 문자열 리터럴, 주로 AIX 5.1을 수정 할 수 있습니다.

코드에서 문자열 리터럴을 수정하면 Linux 용으로 컴파일하기 위해 코드를 다시 작성해야하므로 코드가 서로 다른 플랫폼을 사용하는 것이 어려워집니다.