2014-12-31 2 views
-2

아래에 c로 작성된 2 개의 ASCII 파일을 열고 읽는 코드를 추가했습니다. 코드는 아무런 문제없이 컴파일되지만, 코드를 실행하면 먼저 파일을 제대로 읽지 못하고 모든 값을 0으로 읽습니다. 둘째, printf를 실행 한 후 세그먼트 오류 (코어 덤프) 오류가 발생합니다. 루프 외부에있는 명령. fpin 파일에는 22 개의 행이 있고 fpin1에는 2621440 개의 행이 있습니다. 이 문제에서 해결 방법을 찾을 수 없었습니다. 누군가가이 문제에 대한 해결책을 얻을 수 있도록 도와 주시면 고맙겠습니다.c float 및 int 길이 문제 (세그멘테이션 오류)

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main() 
{ 

FILE *fpin,*fpin1; 
int i,j,m[1000]; 
int *n1; 
float radp[1000], decdp[1000]; 
float *rad1,*decd1,*temp1; 

n1 = (int *)malloc(sizeof(int)); 
rad1 = (float *)malloc(sizeof(float)); 
decd1 = (float *)malloc(sizeof(float)); 
temp1 = (float *)malloc(sizeof(float)); 


if((fpin = fopen("tmp","r")) == NULL) 
{ 
printf("No such file\n"); 
exit(1); 
} 
if((fpin1 = fopen("lfmap.txt","r")) == NULL) 
{ 
printf("No such file\n"); 
exit(1); 
} 


for (i=0;i<22;i++){ 
fscanf(fpin,"%d %f %f",&m[i],&radp[i],&decdp[i]); 
printf("%d %f %f\n",i,radp[i],decdp[i]); 
} 

for (j=0;j<2621440;j++){ 
fscanf(fpin1,"%d %f %f %f",&n1[j],&rad1[j],&decd1[j],&temp1[j]); 
printf("%d %f %f %f\n",n1[j]+1,rad1[j],decd1[j],temp1[j]); 
} 

printf("%d\n",j); 

fclose(fpin); 
fclose(fpin1); 
free(n1); 
free(rad1); 
free(decd1); 
free(temp1); 
} 

감사합니다, Krishnakumar

+1

[C에서 malloc의 결과를 캐스팅하지 마십시오] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). 그리고 먼저 코드를 들여 쓰기를 배우십시오. –

+0

감사합니다. 내 잘못이야. 그리고 들여 쓰기에 대해 유감입니다. – Krishnakumar

답변

2
n1 = (int *)malloc(sizeof(int)); 

n1은 하나의 정수를 저장할 수있는 등 액세스 n1[0]은 유효하지만 n1[1]이 같은이 포인터의 나머지 간다

정의되지 않은 동작을합니다. 또한 해당 유형의 단일 요소에 대한 malloc()

3
n1 = (int *)malloc(sizeof(int)); 
rad1 = (float *)malloc(sizeof(float)); 
decd1 = (float *)malloc(sizeof(float)); 
temp1 = (float *)malloc(sizeof(float)); 

모든 경우, 당신은 할당하고 메모리를 캐스팅하지 않습니다.

다음,

fscanf(fpin,"%d %f %f",&m[i],&radp[i],&decdp[i]); 
printf("%d %f %f\n",i,radp[i],decdp[i]); 

당신은 인덱스 i를 사용하여 아웃 오브 바운드 메모리를 액세스하고 있습니다. 행동은 정의되지 않았습니다.

사이드 참고 :

  1. 항상 fscanf()/scanf()의 성공을 확인합니다.
  2. do not cast의 반환 값은 malloc()입니다.