【问题标题】:printf crashes the programprintf 使程序崩溃
【发布时间】:2011-05-03 06:15:35
【问题描述】:

我正在使用sprintfint 转换为字符串,然后如果我使用printf,程序会崩溃,否则它可以正常工作。谁能告诉我原因?

typedef char* string;
buffer[8] = (string*)malloc(sizeof(string));
buffer[8] = sprintf(buffer[8],"%d",inf[i].mPermissions);

直到这里都可以正常工作,但是当我这样打印时:

printf("%s",buffer[8]);

...我的程序崩溃了。

【问题讨论】:

  • 如果你不分享一些代码:不。哦,你应该使用snprintf而不是sprintf
  • 您还有信息吗?你是如何使用 sprintf 的。崩溃给出了什么错误?您是否正在运行调试器并查看抛出了什么错误?
  • 请在您的问题中包含一些示例代码。 “printf crash”没有说明问题。
  • 我会很高兴地投票重新打开这个问题,因为它有崩溃的代码。正如许多人所说,盲目地调试问题是很困难的。戴上我的读心帽,我猜你没有正确调用sprintf,以至于它已经写满了你的堆栈并且通常会导致未定义的行为。一旦你调用了 UB,任何事情都可能发生。你很幸运,程序崩溃了。如果它似乎工作了一段时间,那就要糟糕得多...然后在不相关的代码部分崩溃。
  • @Shweta:我看到你已经用代码示例更新了你的问题。你给出的代码示例让我相信你对 C 不是很了解。 sizeof(string) 是什么?

标签: c crash printf


【解决方案1】:
typedef char* string;

C 语言没有字符串类型。 char 指针与分配的字符串不同。

buffer[8]=(string*)malloc(sizeof(string));

为什么要将缓冲区中的第 9 项设置为字符串? (C 是零索引的,所以 0-8 = 9 个项目)。那是一个指针数组吗?也许您打算分配一个 8 个字符的缓冲区?

在 C 语言中对 malloc 的结果进行类型转换没有任何意义。在 C++ 中,您必须进行强制转换。

您分配的是指针的大小,而不是缓冲区的大小。

buffer[8]=sprintf(buffer[8],"%d",inf[i].mPermissions);

sprintf 的第一个参数必须是分配的缓冲区,而不是字符(缓冲区的一项)。

printf("%s",buffer[8]);

您正试图打印一个字符串,但传递了一个缓冲区项(一个字符)。


综上所述,我强烈建议在尝试任何形式的字符串处理或动态内存分配之前阅读 C 语言书籍中关于数组和指针的第一章。如果您不知道某些东西是如何工作的,请不要在语法上冒险。

【讨论】:

    【解决方案2】:

    我敢打赌,你没有分配 sprintf 正在写入的缓冲区。

    你需要这样的东西:

    int myNumber = 42;
    char myBuffer[12];
    sprintf(myBuffer, "%d", myNumber);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多