2012-10-12 5 views
0

이 간단한 배열 초기화에서 잘못된 점을 발견 할 수 없습니다. 이 프로그램은 0에서 field[x][y] = ' ';, X에서 세그먼트 폴트와 y와 충돌Segfault가 2 차원 배열을 초기화 할 때

/* init data structures */ 
char **field; 
int field_width=5,field_height=5; 
field = malloc(sizeof(char*)*field_width); 
for(x=0;x<field_width;x++) 
{ 
    field[x] = malloc(sizeof(char)*field_height); 
    for(y=0;y<field_height;y++) 
    { 
     field[x][y] = ' '; 
    } 
} 

내가 잘못 뭐하는 거지의 어떤 생각 (I 코드 : 블록 디버거를 사용)?

+1

이 코드 조각은 나를 위해 충돌하지 않습니다. – Neil

+0

나에게 잘 어울림 –

답변

1

실제로 코드 스 니펫을 단순화했습니다. field_width 초기화되지 않았습니다. 나는 이것이 빌드 동안 경고를하지 않았다는 것에 놀랐다. 그리고 x = 0 일 때 segfault를 생성하는 이유는 정말로 알지 못합니다.

하지만 내 문제가 해결되었습니다. 편의를 위해 모두 죄송합니다.

+0

초기화되지 않은'field_width'를 사용하면 큰 값을 가질 수 있으므로'malloc'이 실패합니다. 실제 코드에서'malloc'의 반환 값을 확인 했습니까? –

+0

나는 확인하지 않았다. 당신의 충고에 따라, 실제로 그것은 실패한 것입니다. 조언 해주셔서 감사합니다. 기억해야 할 좋은 습관이 있습니다! – Cyctemic

1
field = (char*) malloc(sizeof(char*)*field_width); 

char* 어쩌면?

+1

(ANSI) C에서는 malloc의 결과를 캐스팅 할 필요가 없습니다. http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-alloc – reima

+1

을 참조하십시오. C++과 달리 C의 다른 포인터로 'void *'를 명시 적으로 형변환 할 필요가 없습니다. – Neil

0

아니겠습니까? 이 메모리의 field[x] = malloc(sizeof(char)*field_height); 블록이 유효한지 확인하기 위해 지불 할 수 있도록

field = (char**)malloc(sizeof(char*)*field_width); 

편집

malloc는 null을 반환 할 수 있습니다.

+1

C++과 달리, C에서'void *'에서 다른 포인터로 명시 적으로 캐스트 할 필요가 없습니다. – Neil

0

field_width을 초기화하기 전에 무작위 데이터가 포함되었을 가능성이 큽니다. malloc 문에 field_width을 사용하면 triggered undefined behavior입니다. 컴파일러는 malloc을 건너 뛰거나 field_width에 저장된 모든 쓰레기를 사용하거나 심지어 더 나빠진/낯선 물건을 사용하여 원하는대로 할 수 있습니다. 그럼에도 불구하고 malloc 전화가 걸려 들지 않았거나 실행되지 않았거나 NULL이 반환 된 경우 (예 : field_width의 값이 너무 커서 malloc이 될 수없는 값이 포함 된 경우) field의 결과 값을 가리 키지 않았습니다. 유효한 메모리. 그러면 루프에서 field을 참조 해제 할 때 segfault가 발생합니다. 당신은 운이 좋았습니다. 뭔가 잘못되었다는 명백한 징조를 보았습니다. 메모리 오류가 항상 뻔뻔 스럽지는 않은 것은 아닙니다.

관련 문제