gpt4 book ai didi

c - 返回带有指向内部结构数组的指针成员的结构是否安全?

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:59 25 4
gpt4 key购买 nike

如果我们在一个结构中有指向该结构其他成员的指针,如果我们从函数返回该结构,是否保证这些指针仍然指向该结构的内部成员?

以这个小型优化缓冲区结构为例:

#include <stdint.h>
#include <stdio.h>

struct buffer {
uint8_t *begin;
uint8_t *end;
uint8_t sso[20];
};

struct buffer test() {
struct buffer buffer;
buffer.begin = buffer.sso;
buffer.end = buffer.begin + 20;

return buffer;
}

int main(void) {
struct buffer buffer = test();

return buffer.begin == buffer.sso ? 0 : 1;
}

当我在本地编译并运行此代码时,它返回 0,因此 buffer.begin 仍指向 buffer.sso 的开头。但是,这是否保证始终如此,还是取决于特定于编译器的 RVO 行为?

最佳答案

没有。 test() 函数返回时,buffer 后面的内存不再存在。函数返回后,指向此 buffer 和该 buffer 内任何成员的所有指针均无效。

以下将是一个有效的替代方案:

#include <stdint.h>
#include <stdio.h>

struct buffer {
uint8_t *begin;
uint8_t *end;
uint8_t sso[20];
};

void buffer_init(struct buffer *buffer) {
buffer->begin = buffer->sso;
buffer->end = buffer->begin + 20;
}

int main(void) {
struct buffer buffer;
buffer_init(&buffer);

return buffer.begin == buffer.sso ? 0 : 1;
}

关于c - 返回带有指向内部结构数组的指针成员的结构是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57408100/

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