c - 指向结构的指针中的运行时错误

标签 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; 并使用 . 运算符而不是 -> 运算符,事情往往会起作用.谁能解释一下?

最佳答案

这两个语句:

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),否则会泄漏内存。

关于c - 指向结构的指针中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16829494/

相关文章:

c - C 中的测试单元用于服务器监听功能。避免监听阻塞调用

c - 如何通过更改参数来更改C中变量的值

c - 局部变量的数据突然损坏

转换为 void**,出于什么原因?

c++ - 您只需要构建一次 googletest 库吗?

c - 如何控制静态库中公开的 API 集?

c - 将文本文件中的十进制数存储到 C 中的数组中

c++ - 不同指针类型之间的无效比较 : 'type*' and 'type&(*)()'

c++ - gmock : check only one element of vector

c++ - GTest 的 EXPECT_EQ 给出未定义的错误引用