总是出Segmentation fault (core dumped)的错误,请大家帮我看看,什么地方的问题?

gyhs 2003-10-08 09:13:42
multi_connect()
{
...
}
struct tester_t{
char *name;
int (*handler)(char *argv,int port);
} ;

struct tester_t test_1[10] = {
{ "multi-connect",multi_connect},
{"...",...},
{...}
...
};
struct tester_t *find(char *argv)
{
int i;
for(i=0;i<10;i++) {
if(strcmp(argv,test_1[i].name)==0) {
return &test_1[i]; /* found */
}
}
return NULL;
}
int scanport()
{
...
tester->handler(argv,PORT);
}

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

struct tester_t *c;
if (argc<2) {
printf("please input the function's name\n");
exit(1);
}
c=find(argv[2]);
if(c==NULL)
printf("Don't find the function\n");
else
return scanport(argv[1],c);
}

这个程序通过输入的第一个命令行参数指定IP地址,SCAN()扫描此IP地址的端口
然后通过第二个命令行参数指定要调用的函数名,通过结构体中的函数指针调用该函数.
我觉得没有错误,编译以通过,可是运行就出现
Segmentation fault (core dumped)。
请教各位高手,我这个程序到底在什么地方出现问题,感谢!!!
...全文
785 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
liao2001 2003-10-09
  • 打赏
  • 举报
回复
从流程上看似乎没什么问题
错误原因可能是结构体数组的初始化不正确,最好把源码全贴出。
liao2001 2003-10-09
  • 打赏
  • 举报
回复
不好意思,看错了,哈哈,载大跟斗了,55555
liao2001 2003-10-09
  • 打赏
  • 举报
回复
struct tester_t{
char *name;
int (*handler)(char *argv,int port);
} ;

仔细看看,不明白的说!
gyhs 2003-10-09
  • 打赏
  • 举报
回复
UP,请大家帮帮忙,谢了
liao2001 2003-10-09
  • 打赏
  • 举报
回复
你可以在这贴出你的问题,很多人会回答的,我只知道一点皮毛,还称不上高手,有事可以发短信。
gyhs 2003-10-09
  • 打赏
  • 举报
回复
我刚才把程序初始化后,程序可以运行了,没有CORE DUMP,
通过输入 :程序名 ip multi_connect
现在可以调用multi_connect函数

我现在在珠海的一家软件公司实习,也等于是学习,希望以后能向你多请教
liao2001 2003-10-09
  • 打赏
  • 举报
回复
我在广州工作,以前搞的unix下,现在的公司让我用vc做后台程序,有点烦。
至于注意哪些方面吗?
初始化千万别漏掉,特别是对于一个大点的系统来说,等你花了很多精力查出来错误原因是未初始化时,那种感觉,嘿嘿,我遇到几次了,为了系统效率高点(不想memset 6*2048 字节),我没有初始化,可是代码中我调用了别人的函数。。。
liao2001 2003-10-09
  • 打赏
  • 举报
回复
关键问题应该是在
strcmp(argv,test_1[i].name)
strcmp的实现我没看过,不敢断言
你试试这个:
if(strcmp("a",0)==0)
printf("my god\n");
应该会core dump
但:
if(strcmp("a",0)==0);
printf("my god\n");
具体原因,呵呵,我正在思考
gyhs 2003-10-09
  • 打赏
  • 举报
回复
请问高手在哪工作啊?
我现在主要在学LINUX下的C编程,以前玩得太多,荒废了.
现在重新来学,能不能给我一些好的建议,学习过程中需要注意哪些重要方面呢?

不好意思,今天麻烦你了,希望能交个朋友.
gyhs 2003-10-09
  • 打赏
  • 举报
回复
请问高手在哪工作啊?
我现在主要在学LINUX下的C编程,以前玩得太多,荒废了.
现在重新来学,能不能给我一些好的建议,学习过程中需要注意哪些重要方面呢?

不好意思,今天麻烦你了,希望能交个朋友.
gyhs 2003-10-09
  • 打赏
  • 举报
回复
小弟是初学者,搞不懂为什么差一点就会引起CORE DUMP呢?
麻烦解释一下可以吗?谢了
liao2001 2003-10-09
  • 打赏
  • 举报
回复
可怕的周总结会议总算结束了,让我来好好看看你的代码,希望能帮得上忙
gyhs 2003-10-09
  • 打赏
  • 举报
回复
谢了.我全部初始化试试
liao2001 2003-10-09
  • 打赏
  • 举报
回复
别告诉我你输入的是
程序名 ip multi_connect
这样的话不coredump才怪,最好将struct tester_t test_1[10]全部初始化,差一个字母就会引起coredump
liao2001 2003-10-09
  • 打赏
  • 举报
回复
扫了一眼
struct tester_t test_1[10] = {
{ "multi-connect",multi_connect},

};
这个地方是copy漏掉了还是源码就是这样?
gyhs 2003-10-09
  • 打赏
  • 举报
回复
struct tester_t{
char *name;
int (*handler)(char *argv,int port);
} ;

int multi_connect(char *argv,int port)
{
int n,m,sum=0,PORT,sockfd;char ip[50]="localhost";

fd_set mask;
struct timeval timeout={2,0};
struct hostent *he;
struct sockaddr_in their_addr={0};
strcpy(ip,argv);
if ((he=gethostbyname(ip))==NULL)
{perror("gethostbyname");}
PORT=port;
their_addr.sin_addr=*((struct in_addr*)he->h_addr);
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(PORT);

while(1){
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
perror("socketed");
if(fcntl(sockfd,F_SETFL,O_NDELAY)<0){

perror("fcntl ");
}
n=connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr));

timeout.tv_sec=0;
timeout.tv_usec=200;
FD_ZERO(&mask);
FD_SET(sockfd,&mask);
n=select(sockfd+1,(fd_set*)0,&mask,(fd_set*)0,&timeout);
if(n>0) {
sum++;
close(sockfd);
}
else if(n=0) {
perror("select\n");
close(sockfd); break;
}
else {
perror("select error\n");
close(sockfd);break;
}

}
return sum;
}


struct tester_t test_1[10] = {
{ "multi-connect",multi_connect},

};
int scanport(char *argv,struct tester_t *tester)
{
int PORT,sockfd,port[100],*p,i=0,sum[100],t;
char ip[50]="localhost";
pid_t pid;

struct hostent *he;
struct sockaddr_in their_addr={0};
p=port;
strcpy(ip,argv);
if ((he=gethostbyname(ip))==NULL) {
perror("gethostbyname");
}
for(PORT=1;PORT<=65535;PORT++) {
their_addr.sin_addr=*((struct in_addr*)he->h_addr);
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(PORT);

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
perror("socketed");

if (connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))<0) {
perror("connect\n");
close(sockfd);
}
else {
*p=PORT;
p++;
i++;
pid=fork();
if(pid<0)
printf("error");
else if( pid==0){
sum[i-1]= tester->handler(argv,PORT);
}
else {
sleep(2);
close(sockfd);
exit(0);
}
}
}
for(t=0;t<i;t++) {
printf("Test %s port %d with tester %s,connect %d successed \n",
ip,port[t],tester->name,sum[t]);
}
exit(0);
}


struct tester_t *find_func(char *argv)
{
int i;
for(i=0;i<10;i++) {
if(strcmp(argv,test_1[i].name)==0) {
return &test_1[i];
}
}
return NULL;
}
int main(int argc,char **argv)
{
int ch;
struct tester_t *c;

if (argc<3) {
printf("please input the function's name\n");
exit(1);
}
c=find_func(argv[2]);
if(c==NULL)
printf("Don't find the function\n");
else
return scanport(argv[1],c);

}
源码全贴出来了,请大家帮忙看看

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧