如果我跑
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 :(得分:1)
这一行
filename="heat.dat";
表示filename
是[const] char *
指针。在那种情况下,为了做
sprintf(filename, "heat.dat")
你必须预先分配一个可写的内存缓冲区,filename
将指向该内存缓冲区,并且该内存缓冲区足够大以容纳"heat.dat"
字符串。您使用什么方法来分配缓冲区?
答案 1 :(得分: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 */