问题标签 [pointer-conversion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 指针类型的C++隐式转换
考虑这种情况:
假设它offset
是 32 位变量。ptr
有 type int*
,目标架构是 64 位(ptr
8 字节变量也是如此),offset
有 type int
。计算表达式的值时会进行什么转换*(ptr + offset)
?我在哪里可以阅读 2003 C++ 标准中的相关信息?
c++ - 将指针转换为整数,增加该整数并转换回是否安全?
假设我有一个有效的指针p0
:
我知道我可以像这样安全地往返投射它:
但是执行以下操作是否安全?
即我可以确定没有UBp1 == &a[1]
吗?
c++ - 以 void * 和其他指针类型为参数的 C++ 多态函数:它被认为是模棱两可的吗?
将其他指针类型作为参数的 C++ 多态函数void *
:它被认为是模棱两可的吗?
我担心,由于可以将任何指针转换为void*
,下面的第二次调用 bar 会在下面的程序中执行void bar(void*)
而不是我的预期void bar(int*)
吗?
我在我的 g++ 上进行了测试,它按预期运行(即 int* 不会被强制转换为 void*)。但是,任何人都可以就 C++ 语言规范对这个问题发表评论/回答吗?
富.h:
主.cpp:
此外,比方说,bar
现在是虚拟多态函数,将void*
参数作为第一种形式,将基抽象类指针参数作为第二种形式。以派生类指针作为参数的调用会执行第一种形式还是第二种形式?即派生类指针会被转换为它的基抽象类指针(因此第二种形式将起作用),还是void *
在调用之前将其转换为(因此第一种形式将起作用)bar()
?
c++ - Solaris 10 SPARC 64 上的 Protobuf-2.6.1 编译错误
尝试在 Solaris 10 SPARC 64 上编译 Protobuf-2.6.1 时,我得到:
我遵循了官方自述文件,./configure
并且make
.
编译器版本(GCC):
我还阅读了问题protobuf generated files does not compile on Solaris SPARC 64并尝试过,但没有成功。那篇文章适用于 Protobuf-2.4.1,但 Protobuf-2.6.1 发生了变化:
有什么办法可以让 GCC 强制指针转换?
c - 常量字符串的动态数组的正确类型
我一直认为这const char **x
是用于动态分配的 const 字符串数组的正确类型,如下所示:
但是,当使用 VS2017 编译此代码时,我free
在线收到此警告:
我的代码有问题吗?FWIW,当我使用 GCC 编译时,即使使用-Wall -Wextra -pedantic
.
c - 通过在一个结构之间转换指针来实现继承是否合法,该结构是另一个结构的子集而不是第一个成员?
struct
现在我知道我可以通过将指向 a 的指针转换为 this 的第一个成员的类型来实现继承struct
。
然而,纯粹作为一种学习经验,我开始怀疑是否有可能以稍微不同的方式实现继承。
这段代码合法吗?
这段代码似乎产生了预期的结果,但正如我们所知,这远不能证明它不是 UB。
我怀疑这样的代码可能是合法的原因是我看不到这里可能出现的任何对齐问题。但当然,这远非知道不会出现此类问题,即使确实没有对齐问题,代码也可能由于任何其他原因仍然是 UB。
- 上面的代码有效吗?
- 如果不是,有什么办法使它有效吗?
- 有
char space_for_subclasses[];
必要吗?删除了这一行后,代码似乎仍然表现自己
c - 访问结构联合中结构的第一个字段
我有三个结构共享第一个字段的第一个类型和名称:
如果我没记错的话,结构的第一个字段必须从与结构本身相同的地址开始。
这让我想知道工会是否同样适用:
我对此有两个问题:
- 标准是否要求工会始终将其内容放在同一地址?
- 如果结构都具有相同的字段,那么它会起作用吗?只是名称不同?
c++ - 指针转换:指针是否有价值?
指针可以有价值吗?所以在什么情况下使用
结果 100 100
objective-c - 将 Swift 协议传递给 Objective-C 指针
使用 XCode 10.1 / Swift 4.2。
我正在尝试将符合 Swift 协议的对象分配给 Objective-C 指针。以下代码是按预期编译和工作的最小示例,但它给了我以下警告:
如果分配给局部变量:Incompatible pointer types initializing 'NSObject<Animal> *__strong' with an expression of type 'id<Animal> _Nullable'
如果分配给存储的属性:
Incompatible pointer types assigning to 'NSObject<Animal> *' from 'id<Animal> _Nullable'
关于如何解决该警告而不只是使其静音的任何想法?
SWIFT代码:
Objective-C 代码:
c++ - C++:reinterpret_cast 在这些场景中是最佳选择吗?
这一直困扰着我很长时间:如何进行指针转换从任何东西到char *
将二进制文件转储到磁盘。
在 C 中,您甚至都不会考虑它。
然而,在 C++ 中,每个人都说 C-cast 不受欢迎,我一直在这样做:
现在这是从cppreference复制的,所以我认为这是正确的方法。
但是,我从多个来源读到说这是 UB。(例如这个)所以我不禁想知道是否有任何“DB”方式(根据那个帖子,没有)。
我经常遇到的另一个场景是实现这样的 API:
你可以将很多东西转储到这个缓冲区。现在,我一直在这样做:
好吧,我想这也是UB。
现在,真的没有“DB”方式来完成这些任务吗?我见过有人用指针作为整数数学uintptr_t
来完成类似于任务的任务,但我在这里猜测它也是 UB。serialize
sizeof
即使他们是 UB,编译器编写者通常也会做一些合理的事情来确保一切正常。我对此表示同意:要求这不是不合理的事情。
所以我的问题真的是,对于上面提到的两个常见任务:
- 真的没有“DB”方式来完成它们以满足最终的 C++ 怪胎吗?
- 除了我一直在做的事情之外,还有什么更好的方法来完成它们吗?
谢谢!