指向结构的指针运行时错误

时间:2013-05-30 06:35:16

标签: c pointers googletest

我正在使用谷歌C ++测试工具进行单元测试。我是新手C程序员以及测试人员。 以下是我的代码片段:

TEST_F (def_fix, SR_M_T) {
    I_M_S * arg;
    RM__S_F_R_T* message_data;
    char mT[MAX_M_T_LENGTH] = "data";

    strcpy(message_data->mT,mT);
    message_data->rUID[0] = '\0';
    message_data->uT[0] = '\0';

    unsigned char buffer[sizeof(RM__S_F_R_T)+2];
    memcpy(&buffer[2],message_data,sizeof(RM__S_F_R_T));

    buffer[0] = 1;      //This assignment is not important for this test
    buffer[1] = 2;          //This assignment is not important for this test

    arg->payload_data = buffer;

    handleSR(arg);
}

以上操作是创建传入消息。此传入消息arg将用作调用函数handleSR (void *).的参数 def_fix是一个默认的fixture类,其中包含SetUp()TearDown(),并且没有任何花哨的内容。

RM__S_F_R_T是一个包含3个字符串的结构。 I_M_S是一个包含指向RM__S_F_R_T的指针的结构。

当我谷歌测试时,它会产生分割错误。但是当我改变时: RM__S_FR_R_ * message_data;RM__S_FR_R_ message_data;并使用.运算符代替->运算符,事情往往起作用。谁能解释一下?

5 个答案:

答案 0 :(得分:2)

这两个陈述:

RM__S_F_R_T* message_data;
strcpy(message_data->mT,mT);

是罪魁祸首。你永远不会初始化RM__S_F_R_T(谁设计了这个东西?!)指针。如果不将它用作指针,则可以在堆栈上创建可以使用的实例。

修复要么不使用指针(你已经找到了),要么分配内存:

message_data = malloc(sizeof(RM__S_F_R_T));

完成实例后不要忘记free(message_data),否则会泄漏内存。

答案 1 :(得分:0)

这是因为你声明message_data是一个指针,但不指向它。那么它将指向一个随机的内存位置,当你取消引用它时会导致未定义的行为。

将其声明为非指针,或为其分配内存。

答案 2 :(得分:0)

您没有为RM__S_F_R_T *提供内存。在

之后使用message_data
message_data = (RM__S_F_R_T*)malloc(sizeof(RM__S_F_R_T));

答案 3 :(得分:0)

初始化I_M_S * argRM__S_F_R_T* message_data

I_M_S * arg = malloc(sizeof(I_M_S));
RM__S_F_R_T* message_data = malloc(sizeof(RM__S_F_R_T));

另外,请确保在函数TEST_F()的范围之后不使用这些已分配的指针,因为您指定了arg->payload_data = buffer,其中局部变量buffer的范围在函数{{1}之后结束}}

所以,在离开TEST_F()之前释放这些指针:

自由(ARG); 自由(message_data);

答案 4 :(得分:0)

message_data没有任何意义。您需要将初始化的RM__S_F_R_T结构指针作为参数传递给函数,或者在函数本身内初始化它。

此外,我假设message_data->mT是一个char指针。它并没有指向任何目前的东西。

您可以使用malloc为其分配空间,或者如果它是一个char数组,那么请确保它足够大以容纳mT(如果其结构已经初始化)。

以上内容适用于所有message_data成员。

正如其他海报已经提到的那样,不要忘记free()你所拥有的任何内容malloc() - 编辑。