2017-11-10 6 views
-4

나는 C에서 begginner이므로 제발 나와 함께하시기 바랍니다; 배열 문을 *c 또는 c[]으로 만들 수 있음을 알고 있습니다.C에서 Memset에 관한 간단한 문제

내 질문은 memset 함수에 관한 것입니다 :

char str[] = "hello!"; 
    memset (str,'-',2); 
    puts (str); 

작품 잘. 는 그러나 :

char *str = "hello!"; 
    memset (str,'-',2); 
    puts (str); 

망가 작업, 나는 문자 *str = ... 정상적인 배열 문 것을 알고있다.

아무도 내가 이걸 도와 줄 수 있다면 감사합니다!

+0

포인터 및 배열에 관해서는 귀하의 질문이 많은 사람들에게 답변 해줄 것입니다. 가치에 의한 복사 또는 포인터에 의한 복사 (다른 사람들이 그것을 어떻게 부르는 지 참조)와 같은 것을 생각하십시오. 같은 개념이 두 가지로 발생합니다. 'char str = "hello";'는 당신이 그 배열 내에서'hello' 문자열을 복사한다는 것을 의미합니다. 그리고'Char * str = "hello"; 그 리터럴 문자열을 가리키는 포인터를 처리하고'C'에서 그것들을 읽고 액세스하지만 포인터를 쓰거나 편집 할 수는 없습니다. 당신이 지금 그 차이를 이해하기를 바랍니다. – Michi

+0

* c는 배열 문이 아닙니다. – Fredrik

답변

5

차이점은 미묘합니다. 문자열이 저장됩니다.

char str[] = "hello!";은 스택에 업데이트 할 수있는 문자열을 할당합니다.

char *str = "hello!";는 프로그램 CONST 데이터 세그먼트 내의 문자열을 할당하고, 그 세그먼트를 가리 STR을 설정한다. 해당 세그먼트는 조작 할 수 없으며 메모리 액세스 위반시 프로그램이 중단됩니다.


현대 컴퓨터는 복잡한 메모리 레이아웃, 당신은 어떤 점에서 배울해야합니다 개념의 전체 세트 등 Virtual MemoryPaging 과 같은 StackHeap 있습니다.

메모리에로드되는 프로그램은 다른 권한으로 다른 페이지에로드되는 다른 섹션으로 세분화됩니다. 코드 및 전역 const 변수는 쓰기 권한 (읽기 전용) -. 텍스트 및 .rodata 세그먼트가있는 페이지에로드되지만 스택 및 힙은 쓰여질 수는 있지만 실행할 수없는 페이지에는 할당됩니다. 데이터 및 .bss).

2 예에서 문자 스트링 "안녕하세요"

는 CONST 세그먼트 (.rodata)에 할당되고, 따라서 변경 될 수 없다. 당신이

char *s1 = "Hello!"; 
char *s2 = "Hello!"; 

같은 몇 가지 문자열을 정의하는 경우 또한, 그것은 s1 == s2 사실이 될 것입니다 매우 가능성이 높습니다 (주소 비교!) 1 예에서

실제 배열 스택에 할당하고, 충전되고 "hello!\0" (7 바이트)을 포함하는 바이트 이 메모리는 쓰기 가능한 페이지에 할당 된 스택에 있기 때문에 조작 할 수 있습니다.

0
char str[] = "hello!"; 
    memset (str,'-',2); 
    puts (str); 

STR 배열 때문에 그것은 작동하고, 지역 배열은 우리가 수정할 수있는 RAM의 스택 섹션에 저장되어 있기 때문에 그 내용 당신은 수정할 수 있습니다.STR 리눅스의 경우 RAM의 섹션 (읽기 전용) 코드를 가리키는 포인터 및 STR 자체가 스택 섹션에 저장하지만 때문에

하지만

char *str = "hello!"; 
    memset (str,'-',2); // 

이 제대로 동작하지 않습니다. 그래서 당신은 읽기 전용 메모리를 수정하려고합니다, 왜 그것이 작동하지 않을 것입니다.

+0

나는 'str'char 포인터를 두 번째 경우에 사용하고 코드 섹션을 수정하여 코드 위반 주소로 초기화한다고 말하고 싶습니다. 잘못 됐나 ? – achal

+0

좋아, 얘들 아 정말 빨리 repply 주셔서 대단히 감사합니다, 죄송합니다 그것은 내 나쁜 중복, 신의 축복 너희들; – Mondometal