메모리를 올바르게 할당하지 않았기 때문에 유용합니다. matrix
은 정수 포인터가 아닌 정수 포인터를 가리키는 포인터입니다.
할 수있는 올바른 방법이 될 것이다 :
(경고 : 나는 생산에 사용하지 마십시오, 직접 브라우저에 입력) 무슨 일이 일어나고 있는지 이해하는
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
int **matrix,i,j;
matrix = (int **) malloc(sizeof(void *));
*matrix = (int *) malloc(sizeof(void *));
**matrix = 10;
printf("%d", **matrix);
free(*matrix);
free(matrix);
return 0;
}
그것은 쉽게 에 메모리가 각 라인에서처럼 어떻게 보일지 상상에 의해 (주소 | 종류 | 값 {VALUE_TYPE}) :
int **matrix,i,j;
stack:
matrix: 0x00 | &int ** | NULL {int **}
i: 0x04 | &int | GARBAGE {int}
j: 0x08 | &int | GARBAGE {int}
가상 메모리이기 때문에 Operative Systems은 0 (또는 NULL)으로 메모리를 초기화하는 것이 일반적이지만,이 수는 주어지지 않았기 때문에이를 고려하면 좋지 않은 프로그래밍입니다.
stack:
matrix: 0x00 | &int ** | 0xA0 {int **}
i: 0x04 | &int | GARBAGE {int}
j: 0x08 | &int | GARBAGE {int}
heap:
*matrix: 0xA0 | &int * | GARBAGE {int *}
*matrix = (int *) malloc(sizeof(void *));
stack:
matrix: 0x00 | &int ** | 0xA0 {int **}
i: 0x04 | &int | GARBAGE {int}
j: 0x08 | &int | GARBAGE {int}
heap:
*matrix: 0xA0 | &int * | 0xA4 {int *}
**matrix:0xA4 | &int | GARBAGE {int}
**matrix = 10;
stack:
matrix: 0x00 | &int ** | 0xA0 {int **}
i: 0x04 | &int | GARBAGE {int}
j: 0x08 | &int | GARBAGE {int}
heap:
*matrix: 0xA0 | &int * | 0xA4 {int *}
**matrix:0xA4 | &int | 10 {int}
컴파일러 경고를 사용, 당신은 문제를 발견 할 것이다 :
malloc에 힙상의 공간의 주소를 반환합니다. –
행렬의 유형을 생각하고 ** matrix = 10 – Chris
main을 사용하여 수행하려는 작업은 int를 반환해야합니다. 나머지는 보조입니다. – wildplasser