2012-11-29 26 views
1

如果我運行簡單使用的sprintf失敗

filename="heat.dat"; 
prtdat(u_x_length, u_y_length, u[iz],filename); 

它工作正常。如果我將第一行更改爲

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

輸出是8,然後我的程序崩潰了。爲什麼?? 我的實際目的是使用sprintf(filename,"heat%dof%d.dat",rank,numtasks)

如果您需要prtdat常規,這裏有雲:

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'。 – 2012-11-29 19:10:30

回答

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

作品,謝謝大家! – user1058795

+0

不客氣。祝你好運,希望你喜歡它! – 2012-11-30 13:40:34

1

此行

filename="heat.dat"; 

表明filename[const] char *指針。在爲了這種情況下,做

sprintf(filename, "heat.dat") 

你必須預先分配一個可寫的存儲器緩衝區,filename將指向和這將是大到足以容納"heat.dat"字符串。你用什麼方法分配緩衝區?

+0

如果'filename'被聲明爲const,程序將不會編譯。 –

+0

@KerrekSB或者至少會發出警告。據我所知,大多數C編譯器(包括GCC和clang)只會警告const的正確性,不會發出錯誤。 – 2012-11-29 19:19:49

+0

@ H2CO3:啊,你說得對,這只是C語言中的一個警告。雖然這是C++中的一個錯誤:-) –