메모리 누수가 발생하지 않고 int 행렬을 생성하는 데 문제가 있습니다. read_matrix()를 통해 동적으로 주어진 크기의 전역 행렬을 만들 수 있기를 원합니다. 그러나 그때 나는 나중에 기억을 풀 수 있기를 원한다. 그래서 내 메인 메소드에서 두번째 printf는 어떤 메모리도 할당되어서는 안되기 때문에 버스 오류가 발생한다. 이걸 어떻게 만들까요?C에서 포인터가있는 int 행렬 - 메모리 할당 혼동
int** first_matrix;
int** second_matrix;
int** result_matrix;
int** read_matrix(int size_x, int size_y)
{
int** matrix;
matrix = calloc(size_x, sizeof(int*));
for(int i = 0;i<size_x;i++) {
matrix[i] = calloc(size_y, sizeof(int));
}
for(int i = 0;i<size_x;i++) {
for(int j = 0;j<size_y;j++) {
matrix[i][j] = i*10+j;
}
}
return matrix;
}
int main(int stackc, char** stack)
{
first_matrix = read_matrix(10,10);
printf("9:3 %d - 4:6 %d \n", first_matrix[9][3], first_matrix[4][6]);
free(*first_matrix);
free(first_matrix);
printf("9:3 %d - 4:6 %d \n", first_matrix[9][3], first_matrix[4][6]);
}
matrix [i]! = NULL까지 루핑하는 것이 NULL에 마지막 포인터를 설정하지 않아도 작동하는 것 같습니다. 우연의 일치인가요? 다른 나쁜 것입니까? – Fredrik
하나의 여분의 포인터를 할당하고 그것을 설정하지 않으면 OS에 따라 NULL이 기본 * 될 수 있습니다 (Windows는 할당 된 메모리를 0으로 만듭니다. Unix는 그렇지 않습니다). 그렇지 않은 경우 할당 된 배열의 끝에서 벗어나서 NULL 포인터 또는 충돌 가능성이 높아지기 전까지는 해제 상태를 유지합니다. –
calloc은 항상 메모리를 null로 설정합니다. – quinmars