如问题中所述,是否可以在函数内创建结构,然后在函数退出时返回该结构?由于在调用函数之前不会创建结构,因此我不知道在返回值的原型中放入什么。任何建议/帮助都会很棒,谢谢。
static void section_to_segment_map(Elf *elf, GElf_Ehdr *ehdr) {
struct memory_data {
int phdr_addrs[ehdr->e_phnum][2];
int section_bounds[ehdr->e_shnum][2];
} memData;
for(int phead_cnt = 0; phead_cnt < ehdr->e_phnum; phead_cnt++) {
GElf_Phdr mem;
GElf_Phdr *phdr = gelf_getphdr(elf, phead_cnt, &mem);
memData.phdr_addrs[phead_cnt][1] = phdr->p_vaddr;
memData.phdr_addrs[phead_cnt][2] = phdr->p_vaddr + phdr->p_memsz;
}
printf("Starting and Ending Address Values for Program Segments:\n");
for(int i = 0; i < ehdr->e_phnum; i++)
printf("%x --> %x\n", memData.phdr_addrs[i][1], memData.phdr_addrs[i][2]);
Elf_Scn *scn = NULL;
for(int shead_cnt = 0; shead_cnt < ehdr->e_shnum; shead_cnt++) {
scn = elf_getscn(elf, shead_cnt);
GElf_Shdr shdr_mem;
GElf_Shdr *shdr = gelf_getshdr(scn, &shdr_mem);
memData.section_bounds[shead_cnt][1] = shdr->sh_addr;
memData.section_bounds[shead_cnt][2] = shdr->sh_addr + shdr->sh_size;
}
printf("\n");
printf("Starting and Ending Addresses for Program Sections:\n");
for(int j = 0; j < ehdr->e_shnum; j++)
printf("%x --> %x\n", memData.section_bounds[j][1], memData.section_bounds[j][2]);
return memData;
}
答案 0 :(得分:1)
返回在函数中创建的结构?
是否可以在函数中创建一个结构,然后返回该结构..?
没有。必须在函数体之前定义返回类型。
// void section_to_segment_map(Elf *elf, GElf_Ehdr *ehdr) {
struct memory_data section_to_segment_map(Elf *elf, GElf_Ehdr *ehdr) {
然而OP的struct
具有可变大小,因此提前定义struct
失败。
struct memory_data {
// fails "error: variably modified 'phdr_addrs' at file scope"
int phdr_addrs[some_variable][2];
...
} memData;
固定大小的struct
会起作用,但如果大的话可能效率低下。
#define MEMORY_DATA_N_MAX 10
struct memory_data {
int phdr_addrs[MEMORY_DATA_N_MAX][2];
...
} memData;
存在各种动态选项,例如创建包含大小信息的struct
和指向已分配空间的指针。这迫使section_to_segment_map()
分配内存和调用者以确保它是免费的。
struct memory_data {
size_t sz;
int (*phdr_addrs)[2];
int (*section_bounds)[2];
} memData;
答案 1 :(得分:0)
首先,为了从函数返回一个结构,你需要在函数范围之外声明它,所以其他函数也可以使用它。
/* You can change this size if you wish */
#define PHDR_ADDRESS_SIZE (0xffff)
struct memory_data {
int phdr_addrs[PHDR_ADDRESS_SIZE][2];
int section_bounds[PHDR_ADDRESS_SIZE][2];
} memData;
static void section_to_segment_map(Elf *elf, GElf_Ehdr *ehdr)
{
/* Code... */
}
int main(void)
{
memData m = {};
}
为了从函数返回结构,您有两个主要选项。
您需要将函数的返回值更改为“memData”类型而不是“void”。然后,您可以返回该值。 例如:
memData section_to_segment_map(Elf *elf, GElf_Ehdr *ehdr)
{
memData m = {};
/* Code... */
return m;
}
另一个选项,在我看来更加推荐的是将一个out参数传递给函数,这是一个指针。
您需要将指针传递给memData,您可以在函数内部更改它。例如:
void section_to_segment_map(Elf *elf, GElf_Ehdr *ehdr, memData* m)
{
for(int phead_cnt = 0; phead_cnt < ehdr->e_phnum; phead_cnt++) {
GElf_Phdr mem;
GElf_Phdr *phdr = gelf_getphdr(elf, phead_cnt, &mem);
*memData.phdr_addrs[phead_cnt][1] = phdr->p_vaddr;
*memData.phdr_addrs[phead_cnt][2] = phdr->p_vaddr + phdr->p_memsz;
}
/* More of the code.... */
return;
}
要从main调用该函数,您应该执行以下操作:
int main(void)
{
memData m = {};
/* Put your own arguments isntead of <elf>, <edhr> */
section_to_segment_map(<elf>, <ehdr>, &m);
}