如何解决此错误:分段错误?

时间:2017-08-02 10:30:11

标签: c segmentation-fault

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char *argv[]){

    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *hp;
    char buff[100];

    //Create socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0){
        perror("Failed to create socket!");
        exit(1);
    }

    serv_addr.sin_family = AF_INET;
    hp = gethostbyname(argv[1]); *

我认为错误可能在上面一行,但我不知道如何解决 此

当我在Geany,Linux中编译,构建和运行此代码时,我收到了分段错误错误消息。为什么会这样,我该如何解决?

3 个答案:

答案 0 :(得分:0)

如果你使用linux,

 ulimit -a
 ulimit -c ulimited // set core file size limitless

然后再次运行可执行文件。将创建一个核心文件。这是分段错误之前最后一个堆栈的快照。

gdb [executable] core

现在您可以看到分段错误引发的位置。

答案 1 :(得分:0)

我认为你的问题就在这里

<main>
  <aside>Menu</aside>
  <section class="flex-items">
  <div class="flex-item">item1</div>
  <div class="flex-item">item2</div>
  <div class="flex-item">item3</div>
  </section>
</main>

你应该在控制台上发送一些东西作为参数,否则这个空格(argv [1])是无效的,因此发生了分段错误。

在您的情况下,参数应该是您尝试连接的计算机的名称。例如:

hp = gethostbyname(argv[1]);

应该这样做。

答案 2 :(得分:0)

您需要检查argc[1]是否存在。 一个简单的:

if (!argv[1])
   return (-1);

可能会做到这一点。

提示:Valgrind和GDB是两个非常强大的工具,可以找到错误的来源并解决它们。

习惯从这些日志中读取日志需要花费一些时间,但我保证,一旦您习惯了它,不仅大部分超时和SegFaults都会更容易解决,但是你&# 39; ll还能够在跟踪内存泄漏,分配和释放时优化程序的内存消耗。