2012-10-09 4 views
4

대 포인터? string1이 맞나요? 이 스레드 What is the type of string literals in C and C++? 뭔가 다른 말하기 때문에.문자열 리터럴 :</p> <pre><code>char *a = "string1" </code></pre> <p>정확히 문자열 리터럴 무엇입니까 :이 문장에서 char 배열

내 지식까지

int main() 
{ 
    char *a = "string1"; //is a string- literals allocated memory in read-only section. 
    char b[] = "string2"; //is a array char where memory will be allocated in stack. 

    a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults. 
    b[0] = 'Y'; //Valid. 

    return 0; 
} 

는 상기 이외의 몇 가지 세부 사항을 언급 추가하십시오. 감사. 당신은 "큰 따옴표로 둘러싸인 문자의 순서"같은 리터럴 문자열을 볼 수a[0] = 'Y';

Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done. 
(gdb) b main 
Breakpoint 1 at 0x40056c: file ddd.c, line 4. 
(gdb) r 
Starting program: /home/jay/Desktop/MI/chararr/a.out 

Breakpoint 1, main() at ddd.c:4 
4 { 
(gdb) n 
6 char *a = "string1"; 
(gdb) n 
7 char b[] = "string2"; 
(gdb) 
9 a[0] = 'Y'; 
(gdb) 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400595 in main() at ddd.c:9 
+1

@elyashiv에서의 모습, 코드가 불법 되세요. – hmjd

+3

정확한 질문이 무엇인지 확신 할 수 없습니다. 문자열 리터럴에 대한 자세한 내용은 C99 표준의 6.4.5 절을 참조하십시오. – hmjd

+0

아마 [이 stackoverflow 질문] (http://stackoverflow.com/questions/2589949/c-string-literals-where-do-the-go) 도움이 될 수도 있습니다, 또는 [이 하나] (http://stackoverflow.com/questions/2245664/string-literals-in-c). – Richard

답변

11

디버그 출력 표시 오류입니다. 이 문자열은 읽기 전용 메모리에 저장된 이며이 메모리를 수정하려고하면 의 정의되지 않은 동작이됩니다.

어떻게 세분화 오류가 발생합니까?
- 요점은 char *ptr = "string literal"ptr이 문자열 리터럴이 저장된 읽기 전용 메모리를 가리 키도록한다는 것입니다. 따라서이 메모리에 액세스하려고 시도하면 (이는 *(ptr + 0) = 'X'과 같습니다) 메모리 액세스 위반입니다.

한편, char b[] = "string2";은 메모리를 할당하고 문자열 "string2"을 복사하므로 유효합니다. b이 범위를 벗어나면이 메모리가 해제됩니다.

는 리터럴 문자열을 수정하는 시도로 Literal string initializer for a character array

+0

방금 ​​더 자세히 설명하고 싶었습니다. 어떤 쓰레드는'char a [] = "sdsf";를 문자열로 사용한 리터럴을 혼동했다. – Jeyaram

+1

@rjayavrp : * "문자열 리터럴은 큰 따옴표"*로 둘러싼 문자 시퀀스입니다. 예,'char a [] = "sdsf";',' "sdsf"'는 문자열'a'를 초기화하는데 사용되는 문자열 리터럴입니다. – LihO

+0

감사합니다. 그래서 나는 문자열 리터럴이 읽기 전용 섹션에 메모리가 할당 된 문자열이라는 것을 오해했습니다. 메모리 위치를 기반으로하지 않습니다 :). – Jeyaram

관련 문제