【问题标题】:Why am I getting a segfault with this code when using snprintf?为什么我在使用 snprintf 时会收到这段代码的段错误?
【发布时间】:2017-06-28 04:40:33
【问题描述】:

我正在使用 C 语言开发一个简单的 Web 服务器,每当我尝试写入我在另一个函数的 main 中声明的 char[] 时,我都会遇到段错误。在任何人建议之前,我还没有将其声明为字符串文字。我尝试使用 malloc() 进行分配,在初始化时将数组中的每个 char 设置为 null 终止符,并且不将其初始化为任何内容(即在写入新内容之前不会读取它,因此没有理由归零它最初对任何东西),都无济于事。

发生的事情的语法如下:

#define MAX_BUFFER_LENGTH 20

int some_function(char *buffer) { //many other params as well
    //lots of other code 
    snprintf(buffer, MAX_BUFFER_LENGTH, "%s", "HTTP/1.0 404 Not Found"); // This is where the segfault is thrown
}

int main(int argc, char *argv[]) {
    char buffer[MAX_BUFFER_LENGTH];
    //many other declarations
    //...
    some_function(buffer);
}

奇怪的是,段错误只发生在我第一次使用特定语法调用写入缓冲区时。有些请求不会创建段错误。如果我在不提交导致段错误的请求之后提交导致段错误的请求,则它们不再导致段错误。有什么见解吗?

【问题讨论】:

  • char *buffer[MAX_BUFFER_LENGTH]; --> char buffer[MAX_BUFFER_LENGTH];
  • 阅读您的编译器错误消息。如果没有看到,则需要重新配置编译器
  • 对不起,实际上我在上面问的内容中有错字。它不是指针数组;我已经更改了代码以反映我所拥有的给我带来问题的内容。另外,对于任何想知道的人,我正在使用 -Wall 进行编译。
  • 问题出在您没有显示的代码中,这几乎可以肯定是太多代码无法添加到您的问题中。您必须通过调试器和/或 Valgrind 运行它,看看实际发生了什么。
  • 1) 您是否因 posted 代码而失败? 2) 你是否在其他任何地方使用MAX_BUFFER_LENGTH 给它可疑的名字? - 我希望 MAX_BUFFER_SIZE 用于 char buffer[MAX_BUFFER_SIZE]; 并因此期望在其他地方使用不当,因为字符串 lengths 比所需的数组 sizes 小 1

标签: c segmentation-fault printf


【解决方案1】:

您的缓冲区不是字符数组。它是一组字符指针。你的编译器应该警告你类型不匹配。

将声明更改为:

char buffer[MAX_BUFFER_LENGTH];

【讨论】:

  • 仅当您编译时打开警告。在发布关于 SO 的问题之前,这应该是强制性的。
  • @dave:实际上是在信息页面上建议的。但它显然没有被许多提问者阅读。也许在发布之前应该对带有 C(或其他)标签的问题进行一些强制性检查。
  • 建议将缓冲区大小传递给函数,这样some_function 就不必对缓冲区大小做出疯狂的猜测。
  • 对不起,我在上面问的内容实际上有一个错字。它不是指针数组;我已经更改了代码以反映我所拥有的给我带来问题的内容。另外,对于任何想知道的人,我正在使用 -Wall 进行编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2010-10-19
  • 1970-01-01
相关资源
最近更新 更多