2013-05-17 3 views
0

malloc을 사용하여 2D 문자 배열을 만들고 '\ 0'에 값을 할당하려고했습니다. I 출력을 인쇄 할 때malloc을 사용하여 만든 2D 배열에 값 지정

char **predicate_array = malloc(no_of_lines_in_data_map); 
for(int i = 0; i < no_of_lines_in_data_map; i++){ 
    predicate_array[i] = malloc(1024 * sizeof(char)); 
    predicate_array[i][0] = '\0'; 
} 

그러나, 내가 얻을 : 첫 번째 배열은 '\ 0'으로 설정되지 않는 이유

predicate_array[0] = (P; 

predicate_array[1] = 

predicate_array[2] = 

predicate_array[3] = 

predicate_array[4] = 

predicate_array[5] = 

predicate_array[6] = 

... 

... 

사람은 알아?

감사합니다.

답변

3

첫 번째 malloc의 매개 변수가 2 차원 배열에 맞지 않습니다.

char **predicate_array = (char **)malloc(no_of_lines_in_data_map*sizeof(char *)); 
+0

감사합니다. 이것은 문제인 것처럼 보입니다. –

1

아래로

수정이 여기에 내가 위험을 무릅 수있는 유일한 추측. no_of_lines_in_data_map이 7로 설정되어 있는데, 출력 결과에 따라 추측하고, 8 바이트 포인터가있는 64 비트 플랫폼을 사용 중이라면 단일 포인터에 대해서도 충분한 공간을 할당하지 않은 것입니다. 포인터 바이트의 7 * 크기가 아니라 7 바이트를 할당했습니다.

첫 번째 malloc을 할당하려고 시도하면 프로그램이 중단되지만 시스템과 해당 메모리가 프로세스에 할당되었는지 여부에 따라 프로그램이 중단 될 가능성이 있습니다. 따라서 malloc을 수행하고 결과 포인터를 배열의 첫 번째 요소에 할당 할 때 예상 한 7 바이트를 할당하지만 프로그램의 다른 부분이 소유 한 다른 1 바이트는 할당합니다. 이 메모리 주소를 빈 문자열로 설정하는 동안 포인터가 가리키는 메모리 위치에서 데이터를 인쇄하기 전에 포인터의 마지막 바이트를 프로그램의 다른 부분에서 변경하고있을 가능성이 있습니다. print 문.

테스트하려면 no_of_lines_in_data_map을 8 이상으로 설정하고 (아무 것도 수정하지 않고) 출력 첫 번째 비트가 올바른지 확인하십시오 (그러나 프로그램이 여전히 손상되어서 다른 곳에서 오류가 발생하거나 데이터가 손상 될 것으로 예상해야합니다). , 아직도).

영구적으로 수정하려면 vvy에서 제안한 작업을 수행하십시오 (malloc을 캐스트하지 않는 경우는 제외).

또한 내게있는 기억은 연속적인 것이 아니기 때문에 2D 배열을 실제로 할당하지 않는다고 말하고 싶습니다. 실제로 배열 목록을 가리키는 배열을 할당하고 있지만 모든 곳으로 퍼져 있습니다.

+0

감사의 설명 xaxxon! –