2012-02-11 7 views
1

텍스트 파일에서 맵을 읽고 맵의 행과 열 수에 따라 문자열 배열을 만들려고합니다. 그리드의 모든 셀은 2 자의 문자열입니다. 2 * 6 매트릭스를 생성한다C에서 문자열 행렬을 동적으로 할당

**--**--**-- 
--**--**--** 

예컨대

. 행과 열의 수는 각각 ROWS와 COLS입니다. 나는

char ***map = malloc(ROWS * sizeof(char *)); 
for (i = 0; i < ROWS; i++) 
{ 
    map[i] = malloc(COLS * sizeof(char) * 2); 
} 

을 사용하지만이 map[x][y]를 사용하려고하면, 그것은 세그 폴트 것입니다.

답변

1

char ***map;은 "문자열 배열 배열"로 해석 될 수 있으므로 내부 배열에는 실제로 char 포인터가 포함됩니다. 따라서, 루프는 다음과 같이해야합니다 : 또는

for(i = 0; i < ROWS; i++) { 
    int j; 

    map[i] = malloc(COLS * sizeof(char*)); 
    for(j = 0; j < COLS; j++) map[i][j] = malloc(3 * sizeof(char)); // 3 chars because a string has to be terminated by \0 
} 

, 당신은 다음 초기화 코드가 작동 것이다 char **map로지도를 선언 할 수 있지만, 다음의 요소에 액세스 할 수 map[i][j]map[i][j+1]를 사용해야하는 것 개별 세포.

+0

시도해 보았습니다. 지금은 segfault가 아니지만 지금은 배열이 비어있는 것처럼 보입니다. 또는 무엇인가의 이유로 인쇄가되지 않습니다. 배열로 파일을 읽는 방법처럼 보이지 않습니다. http://pastebin.com/8Uu4fNJf – user1002327

+0

어, 배열을 수동으로 채우면 지금 인쇄되는 것처럼 보입니다. 음, 독서 문제를 해결해야한다고 생각합니다. – user1002327

+0

독서 문제에 관해서 : 나는 fgets를 사용하여지도에서 행과 열의 수를 계산했습니다. 물론 EOF까지갔습니다. 그래서 파일을 닫고 다시 열어서 포인터 위치를 다시 시작해야했지만, 더 효율적인 방법이 있어야한다고 생각합니다. – user1002327

0

2D 배열을 원하면 mapchar***으로 선언 하시겠습니까? 이것을 char**으로 변경하십시오.

(. 내가 misunderstoop, 당신은 char*의 2 차원 배열을 원하는 경우에, 당신은 할당을 변경해야합니다 sizeof(char**)sizeof(char*)를 사용하고, 별도로 문자열로 메모리를 할당)

편집 : 당신의 크기를 알고있는 경우 맵을 선언 할 때 char map[ROWS][COLS][2]; (또는 다른 기능으로 전달하려는 경우) char (**map)[2]으로 선언하고 할당을 그대로 유지할 수 있습니다.

(당신이 (예를 들어, 인쇄하려면) \0에 의해를 종료하려면 32 변경)

그것은

char ***map = malloc(ROWS * sizeof(char**)); 
for (i = 0; i < ROWS; i++) 
{ 
    map[i] = malloc(COLS * sizeof(char*)); 
    for (int j=0; i<COLS; ++j) 
     map[i][j] = malloc(3*sizeof(char); 
} 

편집 할 필요가

+1

문자열의 2D 배열이므로 추가 *를 추가했습니다. 'char ** '에서 어떤 일이 일어나는지 보겠습니다. – user1002327

+0

문자열에 메모리를 할당하는 것을 잊지 마십시오! – asaelr

+0

sizeof'char **'와 sizeof'char *'는 시스템 전체에서 동일합니다. 한 포인터 유형의 크기는 항상 다른 포인터 유형과 동일합니다. –

0

: 다른 답변에서 지적 및 주석, 3 malloc'ed 문자가 아닌 3되어야합니다.

+0

하지만 각 엔트리가 2 자임을 미리 안다면,'unsigned short's의 행렬로 만들고, 필요하다면 전체적으로 덜 짜증나게 할 수도 있습니다. –

+0

'malloc' 3 문자, 문자열 문자 2 개와 널 종료 문자 1 개가 더 좋을 수 있습니다. –

+0

여전히 segfaulting입니다. 이것은 소스 코드입니다. http://pastebin.com/Z28gQmyy [-] – user1002327

0

첫 줄 같아야

경험상
char **map = malloc(ROWS * sizeof(char *)); 

가의 malloc 반환형 한 * 추가(). malloc(5 * sizeof(int))으로 5 개의 int 배열을 할당하면 int *이 반환됩니다.

또는, 차원 — char *를 추가로 각 * 생각할 수있는 문자의 1 차원 배열이며, char **는 2 차원 배열입니다.

1

그것은 다음과 같이 수 : 2 char의 당신은 이러한 문자를 저장할 수

int i, j, ROWS = 2, COLS = 6; 
char ***map = malloc(ROWS * sizeof(char **)); 
for (i = 0; i < ROWS; ++i) 
{ 
    map[i] = malloc(COLS * sizeof(char*)); 
    for (j = 0; j < COLS; ++j) 
     map[i][j] = malloc(2 * sizeof(char)); 
} 

하는 것으로, 그러나 당신이 문자열 (printf("%s로 작업하려는 경우 몇 가지 문제가 발생할 수 있습니다, strcpy ...). 이 경우에는 문자를 저장할 수 있도록 3 char에 대한 메모리를 할당하려고합니다.

할당 후에는이 메모리를 정리해야하며 할당에 따라 정리를 역순으로 수행해야합니다. 다음과 같이 표시 될 수 있습니다.

for (i = 0; i < ROWS; ++i) 
{ 
    for (j = 0; j < COLS; ++j) 
     free(map[i][j]); 
    free(map[i]); 
} 
free(map); 

희망이 있습니다.

+0

각 문자열이 2 문자 만 알면 3 번째 문자가 반드시 필요한 것은 아닙니다. –

+0

@ RichardJ.RossIII : 예, 2자를 저장하면 충분합니다. 그러나 그가 인쇄하고 싶다면 어떻게해야할까요? 문자를 종료하면 인쇄를 위해 자체 기능을 작성할 필요가 없습니다. – LihO

+0

@ RichardJ.RossIII : 어쨌든, 좋은 지적입니다. 나는 나의 대답을 편집했다. – LihO

관련 문제