将数组分配给结构指针

assign array to structure pointer

本文关键字:结构 指针 分配 数组      更新时间:2023-10-16

下面的程序中尝试使用指针l_pContent打印内容成员时出现分段错误。

#include <iostream>
#include <string.h>
using namespace std;
struct responseStruct {
    int Handle;
    int headerLen;
    int bodyLen;
    unsigned char* content;
};
int main()
{
    unsigned char l_httpResponse[] = {1,2,3,4,5,6,7,8,9,0,1,2,'a','b','c','d','e','f','g','h','i','j','k','l','a','b','c','d','e','f','g','h','i','j','k','l',0};
    struct responseStruct *l_pContent = (struct responseStruct*)l_httpResponse;
    cout << l_pContent->content << endl;  // Error : Segmentation Fault
    return 0;
}

变量 content 是指向unsigned char的指针,l_httpResponse也是如此。因此,您可以创建responseStruct的实例,然后将该实例的content指针分配给l_httpResponse

下面是一个示例:

#include <iostream>
#include <string.h>
using namespace std;
struct responseStruct {
    int Handle;
    int headerLen;
    int bodyLen;
    unsigned char* content;
};
int main()
{
    unsigned char l_httpResponse[] = {1,2,3,4,5,6,7,8,9,0,1,2,'a','b','c','d','e','f','g','h','i','j','k','l','a','b','c','d','e','f','g','h','i','j','k','l',0};
    // Create instance of an responseStruct struct
    responseStruct rs;
    // Make content point to the start of l_httpResponse
    rs.content = l_httpResponse;
    // Test for access without segfault
    cout << static_cast<unsigned>(rs.content[1]) << endl;  
    return 0;
}

或者这是一个现场演示。

省略了这种代码的想法对我来说很神秘的事实,以下是导致错误的原因:
如果我们假设responseStruct的成员将理想地匹配来自l_httpResponse的数据,sizeof(int)sizeof(unsigned char *)为 4,您的架构使用小端表示法,并且您的编译器使用 ASCII(它可能确实如此),则以:

Handle == 0x04030201
headerLen == 0x08070605
bodyLen == 0x02010009
content == 0x64636261

现在,content是一个指针,所以0x64636261是你记忆中的一个地址。它没有指向你的"abcde..."字符串。它由前四个字节组成。并指向一些不存在的区域。这就是为什么你最终会出现分段错误。