面对功能回归的“堆栈腐败”问题

时间:2013-06-06 06:57:08

标签: c++ pointers

我在函数返回时随机得到"stack corruption detected : aborted"错误。我的代码如下:

struct SND_RCV_CMD_t
{
    int    nRspFieldsCnt;
    char** rspValues;
}

void SendAndReceive(SND_RCV_CMD_t *cmdParams)
{
    cmdParams->rspValues = SendAndReceiveEx(&cmdParams->nRspFieldsCnt);
}

char** SendAndReceiveEx(int* resFieldsCnt)
{
    char** retFields = 0;
    *resFieldsCnt = 0;
    int maxStrings = 500;

    retFields = (char**)malloc(maxStrings * sizeof(char*));

    for(int id = 0; id < maxStrings; id++)
    {
        retFields[id] = (char*)malloc(30 * sizeof(char));
        memset(retFields[id], 0x00, 30);
        sprintf(retFields[id], "%s", fieldVal);
    }

    return retFields;  //At this point I got stack corruption error
}

当我调用SendAndReceive方法时,我的代码会在SendAndReceiveEx方法结束时崩溃。错误说"Stack corruption detected : aborted"

2 个答案:

答案 0 :(得分:3)

您应该使用snprintf。如果fieldVal正好是30或更大,那么它可能会破坏你的记忆。

另一件事是resFieldsCnt设置为0.这是正确的吗?因为之后你没有改变这个值,所以为什么要把它传入?

答案 1 :(得分:1)

我可以在代码中看到的唯一可能隐藏此类错误的事情是,如果fieldVal溢出了您已分配的缓冲区。

你可以检查sprintf的返回值,看看它写的是多少个字符。

您是否尝试过类似valgrind的内容?