문제

이 C 코드가 GCC 4.3.3으로 컴파일 된 경우

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


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

    int * i;

    i = (int *) malloc(sizeof(int));

    printf("%d\n", *i);
    return 0;

}

출력이 Malloc ()가 반환하는 메모리에 있던 모든 것이 될 것으로 예상하지만 대신 출력은 0입니다. Malloc은 리턴하는 메모리를 제로화합니까? 그렇다면 왜?

도움이 되었습니까?

해결책

malloc 자체는 메모리를 제로화하지 않지만 많은 운영 체제가 프로그램이 보안상의 이유를 요청하는 메모리를 제로화 할 것입니다 (한 프로세스가 다른 프로세스에서 사용했던 잠재적 인 민감한 정보에 액세스하지 못하도록합니다).

다른 팁

그만큼 malloc() 함수는 할당 된 메모리를 특정 값으로 설정하지 않습니다. 메모리가 0인지 확인하려면 사용하십시오. calloc() 또는 동등한. 그렇지 않으면, 당신은 이전에 무엇이 있었는지 (당신의 경우에, 0이 될 수 있음) 얻을 수 있습니다.

할당 된 메모리의 값은 공식적으로 정의되지 않았습니다. C99 상태 : The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. Malloc ()는 제로 끄기를 포함하여 원하는 모든 것을 할 수 있습니다. 이것은 의도적으로, 구현의 부작용 일 수도 있고, 당신은 0 인 메모리가 많은 메모리를 가질 수 있습니다.

Apple의 GCC 4.0.1을 사용하여 OS X의 FWIW는 많은 할당을하는 것조차도 0을 만들 수 없습니다.

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

Malloc은 메모리를 채울 필요가 없습니다. 성능의 이유로, 릴리스 버전은 종종 메모리에 아무것도하지 않습니다. "보안"라이브러리에는 메모리를 지우는 malloc 구현이있을 수 있습니다. 라이브러리 구현 자에 달려 있습니다. 다양한 컴파일러의 디버그 라이브러리에 의해 메모리에 채워진 몇 가지 일반적인 패턴이 있습니다. 이 stackoverflow 주제에서 설명했습니다.

당신은 분명히 그것에 의존 할 수 없습니다.

int 여부; int = 0; 또는 int = 00000000; 메모리에서 같은 공간을 차지할 것입니다. Printf는 종종 문자열의 다른 내용에 관계없이 널 터미네이터로 첫 번째 0을 잡습니다. 스트링 비교기를 사용하고 있고 0은 자리 표시자인 경우 문자열 기반 라이브러리가 정말 빨라서 해당 장소 홀더에 대해 0을 사용하는 것이 좋습니다. F를 시도한 다음 컨트롤을 작성하여 널 용어를 삽입하거나 Newline을 삽입해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top