나는 최근에 C에서의 malloc
기능에 관심이 있었고 흥미로운 행동을 관찰했습니다. malloc이 NULL이 된 후 첫 번째 'out of bounds'값처럼 보입니다 (또는 적어도 if
에 의해 false로 간주되는 것을 반환합니다). malloc의 동작 : 처음에는 'out of bounds'값이 항상 NULL/0입니까?
i=0,d[0]=42.000000
i=1,d[1]=42.000000
i=2,d[2]=42.000000
i=3,d[3]=42.000000
i=4,d[4]=42.000000
i=5,d[5]=42.000000
i=6,d[6]=42.000000
i=7,d[7]=42.000000
i=8,d[8]=42.000000
i=9,d[9]=42.000000
out of bounds : i=10
exited 'out of bounds loop' safely
내 질문
은 다음과 같습니다 :이 문제가 예측 여기에 출력의
int main(){ int i; double * d_ptr = malloc (10 * sizeof (double)); //malloc 10 double for (i=0 ; i<10 ; i++){ // initialise them ... d_ptr[i] = 42; } for (i=0 ;i <50 ; i++){ /// loop obviously trying to go out of bounds if (d_ptr[i]){ printf("i=%d,d[%d]=%f\n",i,i,d_ptr[i]); } else { printf("out of bounds : i=%d\n",i); break; } } printf("exited 'out of bounds loop' safely\n"); free(d_ptr); return 0; }
: 여기 는 그림인가? malloc을위한 다양한 변수 유형, 다른 크기를 시도했고, 항상 루프를 안전하게 종료했습니다. 자신의 '크기'까다로울 수, 또는 재 작성 많이 필요를 알고있는 경우
이 예측 가능한 경우, 그것은 상황에서 포인터에 루프에 신뢰할 수있는 방법이 될 수있다?
- 마지막으로, 더 깊은 설명은 무엇입니까? malloc을 수행합니까 메모리 공간을 한 단어 여분 할당 후 할당 하시겠습니까?
경계를 벗어난 액세스는 정의되지 않은 동작입니다. 무엇이든 일어날 수 있습니다. 가장 확실하게 예측할 수 없습니다. – Barmar
할당 한 후 메모리를 해제 한 다음 조금 더 작은 블록을 할당하고 새 블록의 끝에 여전히 '0'이 있는지 확인하십시오. – Barmar