2013-03-21 3 views
0

세분화 오류에 대한 이유 만 지키고 있습니다. 나는 여기에 기억을 malloced했지만 여전히 그것은 seg fault를주고있다. 이것에 대한 이유는 무엇일까요?이유는 무엇입니까? (세그 폴트에 대한 이유를 연구)

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 

void main() 
{ 
    int **matrix,i,j; 
    matrix = malloc(sizeof(int)); 
    **matrix = 10; 
    printf("%d", **matrix); 

} 
+0

컴파일러 경고를 사용, 당신은 문제를 발견 할 것이다 :

 matrix = (int **) malloc(sizeof(void *)); 

malloc에 ​​힙상의 공간의 주소를 반환합니다. –

+0

행렬의 유형을 생각하고 ** matrix = 10 – Chris

+0

main을 사용하여 수행하려는 작업은 int를 반환해야합니다. 나머지는 보조입니다. – wildplasser

답변

2

matrix은 포인터입니다 (이 포인터는 int에 대한 포인터의 포인터입니다). 그리고 포인터가 가리키는 메모리 (충분하지는 않지만)를 할당했습니다.

*matrix

또한 포인터 (가 int에 대한 포인터 될 일)이며,가 가리 키도록 당신 하지 할당 된 메모리를, 그래서 *matrix는 쓰레기를 포함 (또는 malloc() 전화하셨습니까 경우 존재하지 않는 충분한 메모리를 할당하지 않음).

그래서 역 참조 *matrix에는 정의되지 않은 동작이 있습니다. 증상이 확실 할 정도로 운이 좋았습니다.

matrix에 대해 sizeof(int) 바이트를 할당하는 이유는 무엇입니까?

int main(void) 대신 void main()을 정의하는 이유는 무엇입니까? (void main()은 언어를 잘 모르는 작성자가 쓴 서적과 자습서를 찾는 방법으로 주로 유용합니다.)

+0

키스 감사합니다. matrix = malloc (sizeof (int *)); * matrix = malloc (sizeof (int)); 내 문제가 해결되었습니다. –

+1

언제든지 Herb Schildt를 의미합니까? -? – wildplasser

+0

@wildplasser : 예, 예. –

0
sizeof(int) 

저장

sizeof(*int) 

저장 int로 포인터로 크기를 whilist,과 INT의 크기. 크기가 아닌 int 크기를 예약 중입니다. 이것이 문제의 원인입니다.

또한 실제 계산을 수행하려면 * int 포인터에 int를 할당해야합니다.

+1

아니요, 이것은 문제의 원인이 아닙니다. –

1

메모리를 올바르게 할당하지 않았기 때문에 유용합니다. 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} 
관련 문제