2016-09-01 5 views
1

소스 배열 (hist)에 저장된 데이터의 계산을 사용하여 그레이 스케일 이미지 (image)를 만드는 프로그램을 작성 중입니다. 소스 배열에 저장된 데이터는 이미지에 대한 calloc을 호출 한 후 0으로 재설정됩니다.calloc이 다른 변수의 메모리를 덮어 씁니까?

func1(){ 
    float * hist = (float *) calloc(256, sizeof(float)); 
    // operation to populate 'hist' 
    for...{ 
     for...{ 
      hist..... 
     } 
    } 

    hist2img(hist); 
    free(hist); 
    return 0; 
} 

hist2img(hist){ 
    cout << "-> " << hist [4 * 250] << endl; 

    unsigned char * image = (unsigned char *) calloc(256 * 256, sizeof(unsigned char)); 

    cout << "-> " << hist [4 * 250] << endl; 

    free(image); 
    return 0; 
} 

출력은 다음과 같습니다

-> 0.997291 
-> 0 

데이터에 어떻게됩니까? callbe 명령 다음에 hist의 모든 요소는 0입니다. 나는 당신이 256 개 수레 할당 0

--(~$)--> gcc --version 
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609 

--(~$)--> uname 
Linux 4.7.2-040702-generic x86_64 x86_64 x86_64 GNU/Linux 
+0

'hist [4 * 250]'포인터 연산이 잘못되었습니다. – PRP

답변

8

으로 초기화 할 image 필요합니다

float * hist = (float *) calloc(256, sizeof(float)); 

을 당신은

cout << "-> " << hist [4 * 250] << endl; 

은 calloc 콜 제로 UB

인 1000 요소에 액세스 실수로 가리키는 메모리

250 번째 float에 액세스하려면 hist의 t 요소, 그냥

cout << "-> " << hist [250] << endl; 

(histfloat에 대한 포인터이기 때문에, 컴파일러는 부동의 크기를 곱하여 주소를 계산하고, 필요 할 수 없습니다 그 자신)

당신이 사전에 크기를 알고있는 경우, 이 데이터를 할당하는 더 나은의 정적

선언 : 0123을

float hist[256]={0}; 

을 정의: 정적 인덱스가 범위를 벗어난 것입니다 경고가 (하지만 여전히 UB는 어떤 변수 지수는 오프 경계를가는 경우/충돌 : 더 런타임 검사가없는) 경우에

hist2img(float hist[256]){ 

+1

배열을 초기화 할 때'memset'을 사용할 필요가 없습니다 -'float hist [256] = {0}; ('memset (hist, 0, sizeof (hist))'는 명시 적 크기 계산보다 안전하지만 초기화만큼 안전하지는 않습니다.) – molbdnilo

+0

. 제안 해 주셔서 감사합니다. –