2012-12-19 2 views
1

나는 행렬에 메모리를 할당하기 위해 malloc을 사용하고 있지만 나중에 행렬에 요소를 설정하는 모든 액세스를하면 세그먼트 오류가 발생합니다. 이것은 내가 지금 무엇을C에서 행렬에 메모리를 할당하면 나중에 행렬에 액세스 할 수없는 이유는 무엇입니까?

을하고 있어요된다

int **matrix = malloc(rows_number * columns_number * sizeof(int)); 

if (matrix) matrix[0][0] = 1; 

이유는 매트릭스에 액세스 할 수 없습니다이 생성 된 후? malloc 호출이 성공하므로 전체 행렬에 대해 충분한 인접 메모리가 있습니다.

+1

malloc에 ​​대부분의 C 언어의 일부에 의문을 제기, 적어도 이해 - 이것은이 주제에 대해 다른 모든 상상할 수있는 질문에 대한 답변의 과다 여기와 다른 곳에서 검색하십시오 같은 것을보십시오. 솔직히, 나는 질문을하지 않은 malloc에 ​​대한 질문이 있다고 믿을 수 없어 - 대답 : – KevinDTimm

+1

[C에서 할당 매트릭스] 가능한 중복 (http://stackoverflow.com/questions/2128728/allocate- matrix-in-c) – KevinDTimm

+0

이 질문에 대한 상위 답변보기 : BimmerM3

답변

2

여기서 문제는 단지 메모리를 할당했지만 오브젝트를 포인터에 대한 포인터 세트로 선언했기 때문입니다. double subscript는 각 행 또는을 가리키는 포인터 벡터가 얼마나 많은 열이 있는지 컴파일러에 알려주는 유형입니다.

그래서 몇 가지 옵션은 다음과 같습니다

  • 아마도 매크로
  • 가 행 포인터 벡터를
  • malloc에 ​​특정 유형의 객체 그렇게 두 mallocs()을 초기화하여, 코드 첨자 계산을 컴파일러는 ... 예를 들어

볼 수

int (*matrix)[ROWS][COLS] = malloc(ROWS * COLS * sizeof(int)); 
... 
(*matrix)[i][j] 

다음 선언은 또한 작동합니다 :

int (*matrix)[][COLS] = malloc(ROWS * COLS * sizeof(int)); 
+0

늦게 답변을 드려 죄송합니다. 내가 잘못하고있는 것을 봅니다.나는 이것이 가장 완벽하다고 생각하기 때문에이 대답을 받아 들였습니다. 고맙습니다. –

2

int **matrixint에 대한 포인터에 대한 포인터로 matrix을 선언합니다. int 배열에 대한 포인터를 원한다. 이것은 int (*matrix)[columns_number]입니다. INT 포인터하지 INT 요소의 동적 배열

int (*matrix)[columns_number] = malloc(rows_number * sizeof *matrix); 
+0

답변을 주셔서 감사합니다. 다른 하나는 허용 된 것으로 표시했는데 더 완벽하게 보였으므로 매트릭스에 대한 액세스가 더욱 직관적이기 때문에이 방법을 좋아합니다. –

1

당신은 할당 된 메모리 : 당신과 함께 멋지게을 할당 할 수 있습니다. 다음과 같이 시도해 볼 수 있습니다 :

1

의 malloc은 무효 포인터를 반환하면 2 차원 배열을하지 그래서.

int **matrix; 
matrix = malloc(rows_number * sizeof(int*)); 
for (int i=0; i<rows_number; i++) 
    matrix[i] = (int*)malloc(columns_number * sizeof(int)); 
관련 문제