免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2748 | 回复: 5
打印 上一主题 下一主题

[C++] 请教关于结构体数组异常的问题,谢谢! [复制链接]

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-02-22 00:28 |只看该作者 |倒序浏览
本帖最后由 mini_peng 于 2015-02-22 15:01 编辑

定义了一个全局的 结构体:

#define MAXDATASIZE 1024
typedef struct _CLIENT
{
    int fd;                     //客户端socket描述符
    char name[32];              //客户端名称
    struct sockaddr_in addr;    //客户端地址信息结构体
    char data[MAXDATASIZE];     //客户端私有数据指针
} CLIENT;

在.cpp文件函数里:
CLIENT client[FD_SETSIZE];
 
程序运行正常。

调试完后,将该CPP文件改名x.h,加上#ifndef...

然后在程序中#include "x.h",build没问题,但运行时报错:  //注:函数是在新的线程中被调用的。
  0x100008306:  callq  0x100010eba               ; symbol stub for: memset  
Thread2:EXC_BAD_ACCESS(code=1,address=0x...)

//CLIENT client[FD_SETSIZE];    注释这行,就可以往下运行。(卡在这行了)


(环境:MAC PRO ,OS X10.9, XCODE)

何解?谢谢!

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
2 [报告]
发表于 2015-02-22 00:31 |只看该作者
本帖最后由 mini_peng 于 2015-02-22 00:32 编辑

//---------------------------------------

#include <iostream>
#include "pthread.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>


#include "andysubstrfun.h"
#include "message_proc_fun.h"
//------------------------------------------------

#ifndef _pthread_tcp_listen_fun_h
#define _pthread_tcp_listen_fun_h

#define PORT 1980               //服务器端口
#define BACKLOG 10               //listen队列中等待的连接数
#define MAXDATASIZE 1024        //缓冲区大小
#define VALIDCMDLEN 64                        //定义有效的命令串长度;


typedef struct _CLIENT
{
    int fd;                     //客户端socket描述符
    char name[32];              //客户端名称
    struct sockaddr_in addr;    //客户端地址信息结构体
    char data[MAXDATASIZE];     //客户端私有数据指针
} CLIENT;


using namespace std;
//------------------------------------------------
void process_recvData_from_client(CLIENT * client, char *recvbuf, ssize_t len,int client_os_type);
string cmd_str_process_fun01(char *recvStr);
string client_prompt_str;
void *tcp_svr_Listen_fun(void *vargp);
int restart_ntp_fun(void);

//------------------------------------------------

//------------------------------------------------
void  *tcp_svr_Listen_fun(void *vargp)
{
       
    int i=0, maxi=0, maxfd=0, sockfd=-1;
    int nready=0;
    int listenfd=-1, connectfd=0;    //socket文件描述符
    int sin_size;               //地址信息结构体大小
    ssize_t n;
    fd_set rset, allset;        //select所需的文件描述符集合
    struct sockaddr_in server;  //服务器地址信息结构体
    char recvbuf[MAXDATASIZE]={0};  //缓冲区
   
    //CLIENT client[FD_SETSIZE];  //FD_SETSIZE为select函数支持的最大描述符个数
    //上面这行,编译通过,但运行时报错,但在源测试文件.CPP中正常,改到.H就异常。于是改为下面的:
    CLIENT client[1024];
   
        ……(想不明白,于是删除所有代码,加一行,运行一次,发现问题在CLIENT数组这行执行不下去)
    return NULL;
}
//------------------------------------------------

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
3 [报告]
发表于 2015-02-22 15:09 |只看该作者
本帖最后由 mini_peng 于 2015-02-22 16:05 编辑

我怎么发现,只要将函数放在新的线程(pthread)中,就报错。

似乎是发现 将 结构体CLIENT  置入新线程 出问题。

为何???

论坛徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之辽宁
日期:2016-12-15 10:24:1715-16赛季CBA联赛之佛山
日期:2016-11-30 09:04:2015-16赛季CBA联赛之江苏
日期:2016-04-29 15:56:1215-16赛季CBA联赛之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之山东
日期:2016-02-16 11:37:52每日论坛发贴之星
日期:2016-02-07 06:20:00程序设计版块每日发帖之星
日期:2016-02-07 06:20:0015-16赛季CBA联赛之新疆
日期:2018-01-09 16:25:37
4 [报告]
发表于 2015-02-25 15:58 |只看该作者
本帖最后由 bskay 于 2015-02-25 15:59 编辑

栈溢出了吧
CLIENT client[1024];
这个要占多少空间了
改为
CLIENT * p = new CLIENT [1024];
用完后删掉

另外,写C程序就不要包含C++的头文件了

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
5 [报告]
发表于 2015-02-25 22:06 |只看该作者
回复 5# bskay


   
麻烦了,我这个程序一直在运行,不会退出。

CLIENT client[1024];的空间,肯定一直用着的。不过,我可以将  char data[MAXDATASIZE];     改小点。
这里没太多的数据要储存。可以改为char data[128];


论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
6 [报告]
发表于 2015-02-26 09:45 |只看该作者
回复 5# bskay

请问大侠,程序里包含CPP文件,有哪些不妥?(我没见过这么包含,但我包含了能用,我不知道有什么弊端)
谢谢!


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP