2015-01-30 1 views
2
int* data=(int*)malloc(size*sizeof(int)); 
int i=0,tmp; 
while(fscanf(m,"%d",&tmp)!=EOF)data[i++]=tmp; 

왜이 대신 작동합니까? : i < size도 좋은 아이디어 인 경우while 루프 fscanf로

while(fscanf(m,"%d",&data[i++])!=EOF); 

그리고 확인 : 당신은 주소를 전달해야

int* data=(int*)malloc(size*sizeof(int)); 
int i=0; 
while(fscanf(m,"%d",data[i++])!=EOF); 
+0

귀하의 while 루프 조건이 올바르지 않습니다. 'fscanf'가 실패하면 ('0'을 반환합니다),'data [i]'는 할당되지 않은 채로 남아 있습니다. – user694733

+0

사용하는 언어 기능에 대한 설명서를 읽지 못했기 때문입니다. –

+0

답변에 표시된대로 ... 항상 작업이 성공적으로 수행되었는지 확인하기 위해 malloc (! = NULL)에서 반환 된 값을 확인하십시오. C 언어에서는 malloc (및 family)에서 반환 된 값을 캐스팅하는 것이 좋지 않은 아이디어 (미묘한 프로그램 버그로 이어질 수 있음)입니다. 참고 : malloc에서 반환 된 값은 (void *)이므로 자동으로 올바른 유형이됩니다 (캐스팅없이) – user3629249

답변

4

주 : 전달 주소 &, 값 아님. 다른

// fscanf(m,"%d",data[i++]) 
fscanf(m,"%d", &data[i++]) 

:

  • 유형 size_t으로 배열 인덱스를 고려

    • 확인하지 EOF
    • 테스트 인덱스 제한, 1에 대해.
    • malloc()의 결과를 캐스팅 할 필요가 없습니다.
    • malloc 스타일 type *var = malloc(size * sizeof *var)을 고려하십시오.

      int *data = malloc(size * sizeof *data); 
      size_t i=0; 
      while(i < size && fscanf(m,"%d", &data[i++]) == 1); 
      
  • +0

    코드 힌트를 보내 주셔서 감사합니다. – ElConrado