【问题标题】:simple use of sprintf failssprintf 的简单使用失败
【发布时间】:2012-11-17 22:44:24
【问题描述】:

如果我跑步

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

【问题讨论】:

  • 你分配内存了吗,filename指向的?
  • 请说明您如何声明filename

标签: c printf stdio


【解决方案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 */

【讨论】:

  • 不客气。祝你编程好运,希望你喜欢!
【解决方案2】:

这一行

filename="heat.dat";

建议filename 是一个[const] char * 指针。在那种情况下才能做到

sprintf(filename, "heat.dat")

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

【讨论】:

  • 如果 filename 被声明为 const,程序将无法编译。
  • @KerrekSB 或者至少它会发出警告。据我所知,大多数 C 编译器(包括 GCC 和 clang)只警告 const 正确性并且不会发出错误。
  • @H2CO3:啊,你说得对,这只是 C 中的一个警告。不过,它是 C++ 中的一个错误 :-)
  • @KerrekSB 是的,C++ 的类型系统比 C 严格得多(具有所有优点和缺点)。 :)
  • @H2CO3:C 和 C++ 中类型系统的形式严格性几乎相同。 const 正确性违规是两种语言的错误。我们在一些 C 编译器中经常遇到的松散错误检查是这些编译器本身及其默认设置的问题,而不是 C 和 C++ 之间的一些内在差异的指示。
猜你喜欢
  • 2023-03-20
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多