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

这条线

filename="heat.dat";

表明这filename是一个[const] char *指针。在那种情况下,为了做

sprintf(filename, "heat.dat")

您必须预先分配一个可写的内存缓冲区,该缓冲区filename将指向并且足够大以容纳"heat.dat"字符串。您使用什么方法来分配该缓冲区?

于 2012-11-29T19:12:34.650 回答
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 回答