2016-10-09 2 views
-4

제 문제는 메모리를 올바르게 할당하는 방법이 잘 모르겠다는 것입니다. 나는 그것을 연구했지만 아무 소용이 없습니다. malloc에 ​​대한 도움이 될 것입니다.C 세그먼트 화 오류 받기

int main(int argc, char *argv[]) { 

    int i, a[5000], c = 1, m, n, input; 

    scanf("%d", &input); 

    for (i = 0; i <= 9999; i += 2) { 

     a[c] = i; 
     c++; 

    } 

    for (n = 2; n < 1118; n++) { 

     for (m = a[n]; m < a[5000]; m++) { 

      a[m] = a[m+1]; 
     } 
    } 

    printf("%d", a[input]); 

    free (*a); 

    return 0; 
} 
+1

당신은 아주 멀리 검색하지 않았다. 당신은 SO 설명서를 보셨습니까? https://stackoverflow.com/documentation/c/4726/memory-management#t=201610092024124038819 –

답변

2

우선 C 배열은 0부터 시작하는 인덱싱을 사용합니다. c의 초기 값을 1으로 설정 한 다음 루프 내부의 색인으로 사용하면 오프 by이됩니다. 그러면 undefined behavior이 호출됩니다.

그런 다음 free (*a);, a은 배열이 아니며 메모리 할당 자 함수 인 malloc() 또는 패밀리가 반환 한 포인터가 아닙니다.

즉,이 코드에서 *a은 포인터를 제공하지 않습니다. 이는 inta[0]과 동일합니다.

마지막으로 input의 사용자 제공 값에서 바운드 검사를 수행하지 않고 a[input]을 사용하면 UB를 일으키는 바운드 메모리를 액세스 할 수 있습니다.

FWIW, 이전에 malloc() 및 패밀리가 반환하지 않은 free()에 대한 포인터를 전달하면 정의되지 않은 동작이 호출됩니다.

2

위 코드에서는 동적으로 메모리를 할당하지 않습니다. 메모리를 확보 할 필요가 없습니다.

2

'a'가 스택에 할당되므로이를 해제 할 필요가 없습니다.

*alloc 패밀리가 할당 한 변수 만 해제하면됩니다.

-1

malloc은 하나의 인수 - 할당 할 바이트 수를 취합니다. void 포인터 (모든 데이터 유형을 저장할 수있는 메모리 섹션에 대한 포인터)를 반환합니다.

다음은 예입니다.

int *array = malloc(sizeof(int) * 10); 

정수의 10 요소 배열을 할당합니다. 데이터가 초기화되지 않았으므로 배열의 내용은 정의되지 않습니다. calloc이라는 함수가 있는데, 이 0으로 초기화됩니다.

또한 스타일 팁. malloc 호출의 결과를 저장할 데이터 유형에 대한 포인터 (예 : int *array = (int *)malloc(sizeof(int) * 10);)로 캐스팅하려고 시도 할 수 있습니다. 이는 this 게시물에 설명 된 이유로 C 프로그래머가 싫어합니다.

+1

틀린 탭일까요? –