2016-09-29 2 views
3

double matrix_a[nrows][ncols]으로 초기화하지 않고 [i][j]을 사용할 수있는 C로 행렬을 할당하는 흥미로운 방법을 발견했습니다. 할당은C에서의 메모리 특정 유형의 할당

double (*matrix_a)[ncols] = (double (*)[ncols])malloc(sizeof(double) * (nrows) * (ncols)); 

입니다. 그러나이 할당 유형을 적절하게 해제하는 방법을 찾을 수 없습니다. 그것은 free(matrix_a)처럼 간단할까요?

+0

이 할당 독특한 무엇인가? 일반적인 할당 + 캐스트. –

+0

이전에는 본 적이없는 의미에서 유일합니다. 나는'double matrix_a [nrows] [ncols]'를 사용하여 꽤 빨리 할당 된 메모리를 다 써 버렸고 더 효율적인 방법을 찾고있는이 스타일을 발견했다. – mjswartz

+0

방금 ​​힙에 메모리를 할당했습니다. 'double a [m] [n]'은 스택에 할당하고 스택은 힙 (일반적으로)보다 더 제한적입니다. 특별한 것은 없습니다. –

답변

6

맞습니다. free에만 malloc 및 가족으로부터 반환 된 내용을 전달할 수 있습니다. 따라서 한 번 수행 한 사람이 malloc 인 경우 free을 수행합니다. 또한

, there is no need to cast the return value of malloc는 :

double (*matrix_a)[ncols] = malloc(sizeof(double) * (nrows) * (ncols)); 
+0

캐스트를 제거하면 'void *'가 'double (*) [ncols]'로 잘못 변환됩니다. [-fpermissive]' – mjswartz

+1

@mjswartz 이는 C++ 컴파일러로 컴파일하기 때문에 발생합니다. C 컴파일러. C++에서는 캐스트가 필요합니다. – dbush