int 매트릭스 포인터에서 C-메모리 할당 혼란
-
01-07-2019 - |
문제
나는 몇 가지 문제가 생산 int 매트릭스를 만들지 않고 메모리 누수를 방지합니다.내가 원하는 것을 할 수 있어(global)매트릭스에 어떤 크기를 동적으로 통 read_matrix().그러나 나는 할 수 있어야 메모리다.그래서 나의 주요 메소드 두 번째 printf 한 결과 버스에 오류가 이후 그것은 없어야 할당된 메모리습니다.어떻게 나를 만드는 방법에 대해 이동이?
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]);
}
해결책
단지 때문에 메모리가 무료되고 의미하지 않는다 당신은에 액세스할 수 없습니다!의 물론, 매우 나쁘 아이디어를 접 한 후 그것의 것,그러나 그 이유는 작품에서 당신의 예입니다.
Note free( *first_matrix )
무료 s first_matrix[0]
, 지 않은 다른 배열입니다.당신은 아마 어떤 종류의 마커을 의미하는 마지막 배열(지 않는 한 당신은 항상 알 수 있을 때 당신은 무료로 외부 배열 얼마나 많은 내면의 스토리지 할당되는).다음과 같습니다.
int** read_matrix(int size_x, int size_y)
{
int** matrix;
matrix = calloc(size_x, 1+sizeof(int*)); // alloc one extra ptr
for(int i = 0;i<size_x;i++) {
matrix[i] = calloc(size_y, sizeof(int));
}
matrix[size_x] = NULL; // set the extra ptr to NULL
for(int i = 0;i<size_x;i++) {
for(int j = 0;j<size_y;j++) {
matrix[i][j] = i*10+j;
}
}
return matrix;
}
그 때 당신이 그들을 자유롭게:
// keep looping until you find the NULL one
for( int i=0; first_matrix[i] != NULL; i++ ) {
free( first_matrix[i] );
}
free( first_matrix );
다른 팁
당신이 필요가 무료로 각 행은 개별적으로:
void free_matrix(int **matrix, int size_x)
{
for(int i = 0; i < size_x; i++)
free(matrix[i]);
free(matrix);
}
메모리를 해제하지 않는다,그것은 단지는 또 다른 할당할 수 있을 잡아는 같은 양의 메모리입니다.당신이 무엇을 넣어서 그것은 아직 거기에있을 때까지 다른 뭔가를 덮어쓴다.
또한,당신은 확보한 모든 할당됩니다.당신만을 확보하는 포인터 배열 첫 번째 행이 있습니다.하지만 경우에 당신은 무료로 모든 것이 제대로,당신은 여전히 같은 효과가 있습니다.
을 만들려면"버스에 오류"필요한 지점을 메모리에 속하지 않는 당신의 과정입니다.왜 당신이 원하는 어쨌든?
당신은 해방의 첫 번째 행(또는 열)의 first_matrix.쓰 또 다른 기능은 다음과 같다:
void free_matrix(int **matrix, int rows)
{
int i;
for(i=0; i<rows; i++)
{
free(matrix[i]);
}
free(matrix);
}
할 수 있을 만들고 싶어 매트릭스 구조체를 저장하는 그것의 행과 열의 수입니다.
내가 사용하는 것이 좋습니다 valgrind 를 추적하는 자유롭지고 싶은 메모리 반대로 만들려고 노력하는 버스에 오류가 발생합니다.그것은 바위의 다른 많은 물건을 뿐입니다.
Sam
당신이 얻고 있는 메모리 누수가 있기 때문에 당신을 자유롭게 첫 번째의 행렬과 행 목록하지만,없음 1n 행이 있습니다.당신을 호출 할 필요가 무료다.
의 몇 가지 대안을,그러나:-할당 sizeof(int*)행+행cols*sizeof(int)바이트 사용하는 첫 번째 바이트에 대한 행 포인터입니다.는 방법은,당신은 단지 하나의 메모리를 무료로(그리고 그것에 쉽게 할당자,너무) -사용하는 구조체를 포함하는 수의 행이 있습니다.다음 방지할 수 있습니다 행 목록을 전부(메모리를 절약하).유일한 단점은 당신이 기능을 사용하려면,매크로,또는 일부분 표기소 matrix.
는 경우에 당신의 두 번째 옵션을 사용할 수 있는 구조체에서 이 같은 모든 C99 컴파일러,다만을 할당해야 하나의 블록의 메모리(의 크기 numints*sizeof(int)+sizeof(int)):
struct matrix {
int rows;
int data[0];
}
는 개념을 여기에는 모든 calloc 있어야합니다,무료입니다.는 무료 적용해야 합니다 포인터에서 다시 전달되는 calloc.
추천을 만드는 함수(이름 delete_matrix) 을 사용하는 루프를 모두 포인터는 여기에서 할당
for(int i=0;i < size_x;i++){ 매트릭스[i]=calloc(size_y,sizeof(int));}
그런 다음,해당 작업이 완료되면 무료는 포인터에서 할당한다.
matrix=calloc(size_x,sizeof(int*));
방법은 당신이 그것을 하고 있는 지금,
무료(*first_matrix);무료(first_matrix);
을 하지 않을 것이 무엇을 원하는지 확인하여 주십시오.