尝试访问struct数组时出现分段错误

时间:2014-08-04 14:26:07

标签: c arrays

作为任务的一部分,我必须处理三个结构。 FileHeader文件中有一些较大的表,它由SectionHeader结构组成。 Hdr由连续记忆中的一系列结构组成。因此,我应该能够通过在内存中对表的位置进行类型转换来访问该数组。

typedef struct {
    unsigned int offset; // offset in bytes from start of file to section headers
    unsigned short headers; // count of section headers in table
} FileHeader;

typedef struct {
    unsigned int name;
    unsigned int type;        
} SectionHeader;

我应该:使用FileHeader(hdr)中的offset和headers字段来标识节头表的位置和长度。我假设文件的开头是& hdr。

所以我这样做了,但它给了我一个错误。访问此阵列的正确方法是什么?

    int header_location = hdr.offset;
    int header_length = hdr.headers;

    SectionHeader *sec_hdrs = (SectionHeader *) &hdr + header_location;

    SectionHeader sec_hdr;

    for (int i = 0; i < header_length; i++) {

            sec_hdr = sec_hdrs[i];
            if (sec_hdr.type == SHT_SYMTAB) break;
    }

3 个答案:

答案 0 :(得分:2)

试试这个:ElfSectionHeader *sec_hdrs = (ElfSectionHeader *)((unsigned char *) &hdr + header_location);

您的原始代码&hdr + header_location会将指针偏移sizeof(hdr) * header_location,这不是您的意图。

答案 1 :(得分:0)

您将sec_hdrs声明为指向SectionHeader的指针。它不是一个数组,也无法编入索引。您的编译器应该发出警告。

试试这个:

SectionHeader hdrs[header_length]
int header_location = hdrs[0].offset;
int header_length = hdrs[0].headers;

SectionHeader *sec_hdrs = hdrs + header_location;

SectionHeader sec_hdr;

for (int i = 0; i < header_length; i++) {
     sec_hdr = sec_hdrs[i];
     if (sec_hdr.type == SHT_SYMTAB) break;
}

答案 2 :(得分:0)

以下是内存的可视化,其中包含初始偏移量,然后将SectionHeader置于连续内存中。

header_location | sizeof(SectionHeader)| sizeof(SectionHeader) | sizeof(SectionHeader)

vijairaj对代码中可能存在的错误提出了非常有用的观点。

  

您的原始代码&amp; hdr + header_location会使指针偏移   sizeof(hdr)* header_location,这不是你的意图。

这是一个有效的诊断,您应该研究指针算法的工作原理。我们按地址大小增加地址。一旦确定* sec_hdrs指向正确的位置,请重新运行程序。如果段错误仍然存​​在,请尝试我的下一条调试建议。

  

是的,在这里的其他问题上,我已经看到你可能必须首先使用malloc。但是我不明白为什么如果你有一个指向数组的指针,如果你知道它在连续的内存中,以及如何执行此操作,那么这是必要的。

仅仅因为我们知道某些东西在连续的记忆中并不意味着它被我们的程序覆盖或重用是安全的。这就是malloc的重点 - 保护某些内存块不被覆盖。如果访问未分配的内存,则存在访问敏感数据,覆盖程序相关数据或存储将被覆盖的数据的风​​险。这就是为什么会发生段错误,这就是你需要malloc的原因。

确保你有足够的空间:

 malloc(header_location + header_length * sizeof(SectionHeader))

这行代码说:“请为一个偏移量和n个SectionHeader分配连续的内存”。 malloc调用将返回指向该内存块(&amp; hdr)的开头的指针,然后然后您可以访问该内存块中的任何内容。

也许包含为您提供&amp; hdr的代码?希望这有用!