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