2014-04-29 1 views
2

나는 c의 문자열을 실험 해왔다. 여기이 코드 조각에. 메모리에 문자열 "출력"을 수행문자 배열 리터럴은 어디에 그리고 어떻게 생성됩니까?

#include<stdio.h> 
int main() 
{ 
    char *arr="output"; 
    *arr='s'; 
    printf("%s",arr); 
return 0; 
} 

생성받을 우리가 처음이 문자열을 가리키는 (스택에있는) 포인터 편곡을 가지고, 이유는 몇 가지 다른 문자를 할당 할 수 없습니다 바늘? 이 프로그램을 실행하려고하면 segmentation fault 인 signal : 11 런타임 오류가 발생했습니다.

나는 C++에서 "output"문자열이 읽기 전용 메모리에 생성된다는 것을 알게되었습니다.이 메모리는 컴파일시 문자열 상수에서 'char *'로 변환됩니다. C에서의 동작은 무엇입니까?

왜 이것이 세그먼테이션 오류를 일으키는 지 설명 할 수 있습니까? 그리고이 문자열은 어디에서 "출력"이 처음 생성됩니다.

감사합니다. 메모리에 문자열 "출력"을 수행

+0

.rodata 섹션 –

+0

@SteveCox 섹션에서 지적한 코드가 그대로 유지됩니다. – maxywb

+0

문자열 (때로는 기타)이 프로그램 텍스트 섹션 (읽기 전용 데이터)에 배치됩니다. –

답변

7

자체가 정적 인 배열

생성하자. 같은 내용의 다른 문자열 리터럴 배열과 같은 위치에 있는지 여부는 지정되지 않았습니다.

왜 다른 문자를 포인터에 할당 할 수 없습니까?

이렇게하면 정의되지 않은 동작이 발생합니다.

왜 이것이 세그먼테이션 오류를 일으키는 지 설명 할 수 있습니까?

많은 구현은 쓰기 보호 된 메모리에 문자열을 저장하므로 시도 할 때 오류가 발생합니다. 현대의 C++에서 (const char* 대신)으로의 변환은 더 이상 사용되지 않지만 금지되어 있습니다.

c의 동작은 무엇입니까?

C++에서와 같이 리터럴을 수정하려고하면 정의되지 않은 동작이며 구현 세부 정보는 두 언어로 지정되어 있지 않습니다. 나는 C와 약간 구식인데, 그래서 char*으로의 dodgy 변환이 허용되고, 비추천되거나, 금지되어 있는지 요즘은 아닙니다.

+1

모든 상수 리터럴 (그리고 역사적인 이유로 C에서'char []'형식의 문자열 리터럴)은 유형에 관계없이 잠재적으로 병합 될 수 있습니다. – Deduplicator

1

여기에 체크 아웃 좋은 자원이다 : https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

언급 한 바와 같이 주된 이유, 그것은 정의되지 않은 동작 것입니다. 출력 할 값을 설정하는 첫 번째 호출에서 문자 배열을위한 공간을 이미 할당했기 때문입니다. 그런 다음 같은 배열을 다른 메모리 공간으로 업데이트하려고합니다. 변수 arr에 대한 메모리를 해제하고 새 메모리를 malloc하는 것이 가장 좋습니다. 메모리는 쓰기 후에 읽기 전용이어야하며 완료 후에 해제해야합니다. 새로운 정보가 필요하고 변수를 재사용하고 싶다면, 새로운 메모리를 malloc하십시오.

관련 문제