Char []丢失数据

时间:2014-07-09 14:51:05

标签: c memory irc

所以我有一个结构存储有关IRC连接的信息。它工作正常,但当我尝试修改它时,它变为空;

这是我的结构:

struct connection_info{
    char user[MAXBUFF + 1];
    char host[MAXBUFF + 1];
    char port[MAXBUFF + 1];
    char nick[MAXBUFF + 1];
    char channel[MAXBUFF + 1];
};

struct connection_info info; //Global Struct

然后我有一个全局结构(connection_info)和我的main方法,它定义结构中的每个元素并连接到IRC服务器。连接到IRC服务器后,我会监听消息并解析它们。在我这样做后,我以不同的方式回复每条消息。这是我的问题发生的地方。

 if(strstr(message.message, "!JOINCHANNEL") != NULL){
        char* str = strtok(message.message, " ");
        char* channel = strtok(NULL, " ");

        if(str == NULL || channel == NULL || (*channel) != '#'){
            strcpy(buff, "PRIVMSG ");
            strcat(buff, info.channel);
            strcat(buff, " :Please use format !JOINCHANNEL [#CHANNEL]\r\n");
            while(send_message(buff) == -1);
        }else{
            strcpy(buff, "PART ");
            strcat(buff, info.channel);
            strcat(buff, "\r\n");
            while(send_message(buff) == -1);

            memeset(info.channel, 0, sizeof(info.channel));
            strcpy(info.channel, channel);

            memset(buff, 0, sizeof(buff));
            strcpy(buff, "JOIN ");
            strcat(buff, info.channel);
            strcat(buff, "\r\n");
            while(send_message(buff) == -1);
        }
    }

两个问题:

它实际上会更改为正确的频道,除非我在频道名称中得到奇怪的字符(我有时会这样做)(颠倒的问号)。为什么这有时会发生,如果我的message.message是三个部分“!JOINCHANNEL #test random”,它永远不会发生,但当它有两个部分时,它有时会给我随机字符:“!JOINCHANNEL #test”。我怎样才能解决这个问题?

其次,更重要的是,在handle_message函数返回后,info.channel的值似乎消失了。我认为strcpy()会在返回后保留值,因为它是一个char [4097],但它似乎没有。我做错了什么或是否有我没有听说过的错误。

1 个答案:

答案 0 :(得分:0)

编辑:假设buff已经是一个malloc指针(因为你将它传递给一个函数,据我所知,那里没有任何功能问题),我修改了我的代码。当我第一次回答这个问题时,我误解了它。

我没有看到任何动态内存分配,而char[4097]没有这样做,所以我觉得这就是问题所在。如果不是这样,我会删除这个答案。

基本上在函数返回后,char[4097]中堆栈上分配的内存超出了范围。无论堆栈是什么样的,您都需要内存持久化。您希望在handle_message之外包含看起来像这样的代码:

struct connection_info{
    char* user;
    char* host;
    char* port;
    char* nick;
    char* channel;
};

struct connection_info* info

handle_message

info = malloc(sizeof(connection_info));
// Then, in the code snippet you posted
if(strstr(message.message, "!JOINCHANNEL") != NULL){
    //You can initialize with calloc instead of memset with 0s
    info->channel = calloc(strlen(channel)+1); 
    strcpy(info->channel, channel);
}