gpt4 book ai didi

c - 返回在函数内创建的结构?

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:32 24 4
gpt4 key购买 nike

如问题中所述,是否可以在函数内创建结构,然后在函数退出时返回该结构?由于在调用函数之前不会创建结构,所以我不知道在原型(prototype)中放入什么作为返回值。任何建议/帮助都会很棒,谢谢。

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;
}

最佳答案

Return a structure that was created within a function?
is it possible to create a structure within a function, and then return that structure ..?

没有。返回类型必须在函数体之前定义。

// 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;

关于c - 返回在函数内创建的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47798086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com