如何解决此错误:分段错误? #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(int argc,char*argv[]){ int-sockfd; 服务地址中的结构sockaddr\u; 结构主机*hp; 字符buff[100]; //创建套接字 sockfd=套接字(AF_INET,SOCK_STREAM,0); if(sockfd

如何解决此错误:分段错误? #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(int argc,char*argv[]){ int-sockfd; 服务地址中的结构sockaddr\u; 结构主机*hp; 字符buff[100]; //创建套接字 sockfd=套接字(AF_INET,SOCK_STREAM,0); if(sockfd,c,segmentation-fault,C,Segmentation Fault,我想错误可能在上面,但我不知道如何解决 这个 当我在Linux的Geany中编译、构建和运行这段代码时,会收到一条分段错误消息。为什么会这样?我如何解决它?如果您使用Linux #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <arpa/inet

我想错误可能在上面,但我不知道如何解决 这个

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

如果您使用Linux

#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]); *
然后再次运行可执行文件。将创建一个核心文件。这是分段错误之前最后一个堆栈的快照

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

现在您可以看到分段错误出现的地方。

我认为您的问题就在这里

gdb [executable] core
您应该在控制台上发送一些内容作为参数,否则此空间(argv[1])无效,因此出现分段错误

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

hp = gethostbyname(argv[1]);

应该这样做。

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

./program hosToConnectTo
可能会成功

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


从这些日志中读取日志需要一点时间,但我保证,一旦您习惯了,不仅您的大多数超时和分段故障将更容易解决,而且您还能够优化程序的内存消耗,因为它跟踪内存泄漏、分配和释放.

此代码不完整且无法编译。在这样一个小程序中出现SEGFAULT是开始学习调试的好时机。使用gdb运行代码并检查崩溃发生的位置。是否传递任何命令行参数?您没有验证
argc
是否至少为2。之所以发生这种情况,是因为您没有传递命令行参数-y如果
argc
小于
2
,则必须以
/a.out hostname.com
/complaint的身份运行此程序。注意,这不是MCVE。OP也可以在GDB中运行程序并等待崩溃。
if (!argv[1])
   return (-1);