1

私が走れば

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);
}
4

2 に答える 2

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 */
于 2012-11-29T19:14:57.797 に答える
1

この行

filename="heat.dat";

filenameそれが[const] char *ポインタであることを示唆しています。その際に行うためには

sprintf(filename, "heat.dat")

filename文字列を保持するのに十分な大きさの書き込み可能なメモリ バッファを事前に割り当てる必要があり"heat.dat"ます。そのバッファを割り当てるためにどのような方法を使用しましたか?

于 2012-11-29T19:12:34.650 に答える