gpt4 book ai didi

c++ - 将 intptr_t 传递给需要 int 的函数是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:52 25 4
gpt4 key购买 nike

更具体地说,如果我有以下函数指针类型:

typedef void (*callback_type) (intptr_t context, void* buffer, size_t count);

我可以安全且没有“未定义的行为”吗:

callback_type func_ptr = (callback_type)write;
intptr_t context = fd;

func_ptr(context, some_buffer, buffer_size);

?

其中 write() 是系统调用(编辑:具有签名 ssize_t write(int fd, const void *buf, size_t count);,因此需要一个int 作为第一个参数),fd 是一个 int 文件描述符。我假设 C 和 C++ 的答案是一样的,所以我标记了两者。

最佳答案

没有

这将不可移植,因为您要传递的参数在通用 LP64 范例中大小不同。

此外,您没有使用正确的类型取消引用函数指针, 的结果是未定义的。

现在,您似乎已经得出结论,函数指针将按预期工作,唯一实际的问题是:write(2) 将如何解释 intptr_t 第一个参数?

实际的运行时问题是,在 LP64 上,您将 64 位值传递给 32 位参数。这可能会错位后续参数。在具有寄存器参数的系统上,它可能会工作得很好。

关于c++ - 将 intptr_t 传递给需要 int 的函数是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15853353/

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