2012-11-29 2 views
1

실패합니다. 첫 번째 줄을간단한 사용

printf("%d",sprintf(filename,"heat.dat")); 

으로 변경하면 출력이 8이되고 프로그램이 중단됩니다. 왜?? 내 실제 목표는 sprintf(filename,"heat%dof%d.dat",rank,numtasks)입니다. 당신이 prtdat 루틴을해야하는 경우

, 여기 간다 :

filename="heat.dat"; 

filename[const] char * 포인터 제안

void prtdat(int u_x_length, int u_y_length, float *u, char *fnam) { 
int ix, iy; 
FILE *fp; 

fp = fopen(fnam, "w"); 
for (iy = 0; iy < u_y_length; iy++) 
     for (ix = 0; ix < u_x_length; ix++) 
     { 
     fprintf(fp, "%6.1f", *(u+iy*u_x_length+ix)); 
     if (ix != u_x_length-1) 
      fprintf(fp, " "); 
     else 
      fprintf(fp, "\n"); 
     } 
fclose(fp); 
} 
+0

'filename'이 (가) 가리키는 메모리를 할당 했습니까? – chill

+1

'filename'을 어떻게 선언하는지 보여주십시오. –

답변

1

"heat.dat"은 상수 문자열 리터럴입니다. 프로그램의 읽기 전용 데이터 세그먼트에 할당됩니다. 따라서 filename 포인터는 filename="heat.dat"; 할당 후에 읽기 전용 메모리를 가리 킵니다. 결과는 정의되지 않은 동작입니다. 아이디어가 작동하려면 filename이 충분한 크기의 비 상수 메모리를 가리켜 야하고 그 메모리에 저장하려고하는 문자열을 저장해야합니다. 예 :

char filename[256]; /* This is the key - a non-constant memory is allocated on stack */ 
printf("%d",sprintf(filename,"heat.dat")); /* sprintf now does not crash */ 
+0

Works, 고맙습니다! – user1058795

+0

당신은 오신 것을 환영합니다. 행운을 빕니다 프로그래밍, 나는 그것을 즐기시기 바랍니다! –

1

이 줄. 순서이 경우 당신이 지적하고있는이 "heat.dat" 문자열을 저장하기에 충분히 큰 것 filename 쓰기 가능한 메모리 버퍼를 미리 할당 할 필요가

sprintf(filename, "heat.dat") 

할 수 있습니다. 버퍼를 할당하기 위해 어떤 방법을 사용 했습니까?

+0

'filename'이 const로 선언되면 프로그램이 컴파일되지 않습니다. –

+0

@KerrekSB 또는 적어도 경고를 내 보냅니다. 내가 아는 한, 대부분의 C 컴파일러 (GCC와 clang 포함)는 const 정확성에 대해서만 경고하고 오류를 발생시키지 않습니다. –

+0

@ H2CO3 : 아, 네 말이 맞아. C에서의 경고 일 뿐이야 .-) –

관련 문제