2016-12-19 2 views
1

다음과 같이 간단한 프로그램을 작성했습니다.메모리 액세스 위반이 C에서 오류를주지 않는다

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() 
{ 
    char *a=NULL; 
    int i; 
    a = malloc(sizeof(char) *10); 
    memset(a,100,'\0'); 

    if(a == NULL) printf("errr\n"); 
    for(i=0;i<20;i++) 
     a[i]='c'; 

    printf("%s",a); 
    printf("%d",strlen(a)); 
} 

여기서는 10 바이트 만 할당하고 20 바이트를 할당했습니다. 코드를 성공적으로 컴파일하고 세분화 오류없이 실행하십시오.

제 질문은 여기에 어떤 세분화 오류도주지 않는 이유는 무엇입니까?

+2

seg 오류를 제공 할 필요는 없으며 간단히 [정의되지 않은 동작] (http://en.cppreference.com/w/cpp/language/ub)이므로 프로그램이 나타날 수도 있습니다. '작업'. – George

답변

2

인증되지 않은 (잘못된) 메모리 액세스는 undefined behavior을 호출합니다. 결과는 정의되지 않았습니다.

는 세그먼트 오류는 UB의 많은 가능한 결과의 하나가 아닌 내가 보관하지 대위 님! UB를 호출하는 코드가 특정, 심지어 세그먼트 오류에 대한 어떤 것도 기대할 수있다 기억하십시오.

성공적인 컴파일 부분에 대해 컴파일러가 컴파일을 거부하는 구문 오류가 없으므로 컴파일이 성공한 것입니다. 그것과는 별도로

, 일부 관측 지점/제안

  • memset(a,100,'\0'); 잘못 것으로 보인다, 당신이 할 수 있습니다 것은 memset(a,'\0', 100);이지만 어쨌든 할당 된 크기를 초과 할 것 같은 그 또한 잘못 될 것입니다.
  • 호스트 환경의 경우 main()에 대한 서명은 최소한 표준을 따르는 int main(void)입니다.
  • 반환 된 포인터를 사용하기 전에 항상 malloc()의 성공 여부를 확인하십시오.