2014-09-22 5 views
-6

나는 64 비트 linux 머신을 사용하므로 포인터의 크기가 8 바이트이므로 아래 코드를보고 H (strcpy()) 문자열 바로 뒤에 segfault 프로그램을 작성했습니다. 그러나 일어나는 것 같지 않습니다. 아래의 프로그램을 사용하면 x의 메모리가 오버런되어 손상 될 것이라고 생각했습니다. 이 프로그램은 내 시스템에서 잘 실행되지만, strcpy()에 다른 문자를 추가하면 segfaults가됩니다. 따라서 이러한 문제는 시스템에 따라 다르지만이 문자열이 프로그램을 중단시키지 않는 이유는 무엇입니까? 나는 그런 문제를 찾았고, 어떤 링크가 있다면 당신은 나를지도 할 수있다. 미리 감사드립니다.C에서 문자열은 어떻게 처리됩니까?

int main() 
{ 

int x; 
char* c ; 

x = 0xF0000000; 

strcpy(&c,"ABCDEFGHFFFFFF"); 
x++; 
printf("%X\n",x); 

printf("%s\n",&c); 

} C에서 포인터와 메모리 관리에 관해서는

+4

포인터를 선언했음을 알지만 ... 무엇을 가리키고 있습니까? –

+0

물론 경고와 함께 컴파일하려고하지만 다음과 같은 출력을 내게됩니다. 'F0000001ABCDEFGHFFFFFF' 이제이 방법은 기존 프로그램 작성 방법입니다. 문자열을 복사하는 방법을 보려고하고 있습니다. 얘들은 분명히 대답이 없습니다. –

+0

당신의 프로그램은 단순히 UB 일 뿐이며, 논쟁 할만한 것은 없습니다. 특정 실행에서 자신의 경우 정확히 무슨 heppens 알고 싶다면, 디버거를 깨고 단일 단계. 디버거를 사용하면 프로그램 동작이 변경 될 수 있습니다. – Deduplicator

답변

0

:

  • 당신은 당신이 메모리 당신이 초기화가 수동으로
  • 을 할당 할 필요가 수동으로
  • 을 포인터를 생성해야 할당 된 메모리를 수동으로 가리키는 포인터

표현

char *c; 

는 포인터를 만들어,하지만 둘은 문자에 대한 메모리를 할당 않으며, 할당 된 메모리 포인터를 초기화 않습니다.

당신은 형편이 훨씬 더 위치 :

char c[20]; 

c 포인터처럼 행동하지만, 동시에 당신과 c (main의 스택 프레임에서) 20 바이트 버퍼를 할당했습니다 그 시작을 가리키고 있습니다.

문자열 (문자 포인터)를 사용하는 경우, 당신이 할 포인터의 주소로 strcpy하지만, 포인터가 보유한 주소 :

strcpy(c, "ABCDEFGHFFFFFF"); 

그냥 보조 노트로 : 표현 "ABCDEFGHFFFFFF" 할당 리터럴 텍스트와 메모리에 0이 끝나는 상수 문자 버퍼이며 그 주소를 반환합니다. 이것이 그러한 사용이 합법적 인 이유입니다.

관련 문제