문제

나는 몇 가지 문제가 생산 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);

을 하지 않을 것이 무엇을 원하는지 확인하여 주십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top