gpt4 book ai didi

c - 在 C 中分配指针时的显式转换

转载 作者:行者123 更新时间:2023-12-04 10:37:33 24 4
gpt4 key购买 nike

如果我在 C 中编写以下代码:

#include <stdio.h>

int main() {
char c;
int* ip;
char* cp;

cp = &c;
ip = cp;

printf("%p %p %p %p\n", cp, ip, cp+1, ip+1);

return 0;
}

我收到关于未将 cp 显式转换为 ip 的警告。但是,代码本身似乎工作得很好。如果 c 的地址为 1000,我将得到 1000 1000 1001 1004 作为输出。

我的问题是为什么需要显式转换。仅仅是因为 C 标准没有说明任何关于指针的隐式转换(void* 除外)还是在显式转换中发生了其他事情?

最佳答案

I get a warning about not explicitly casting cp to ip.

那么您没有使用足够严格的编译器设置进行编译。如果您希望在 C 语言违规时得到错误,您需要类似 gcc -std=c11 -pedantic-errors 或等价物。

However, the code itself seems to work just fine.

char*int* 不是兼容的指针类型。就 C 语言而言,您的代码不够好 - ip = cp; 违反了“简单赋值”规则。因此,您的代码依赖于未定义的行为和非标准的编译器扩展。

My question is why is the explicit cast needed. Is it simply because the C standard doesn't state anything about implicit conversions of pointers (other than void*) or is there something else going on in the explicit cast?

具体来说,由于如何使用赋值运算符的规则,在 C17 6.5.16.1 简单赋值中声明,强调我的:

One of the following shall hold:
/--/
- the left operand has atomic, qualified, or unqualified pointer type, and (considering the type the left operand would have after lvalue conversion) both operands are pointers to qualified or unqualified versions of compatible types, and the type pointed to by the left has all the qualifiers of the type pointed to by the right;

相同的规则对于 void* 和空指针常量有异常(exception)。

关于c - 在 C 中分配指针时的显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58130889/

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