And*_*hai 1 c arrays string string-literals
好吧,我相信我已经搜索得足够多了,我找不到任何解释.
当你投了char一个int,这是好的和明显的.
char foo = 'a';
int bar = (int)foo;
printf("%i",bar); //Outputs 97 as expected.
Run Code Online (Sandbox Code Playgroud)
但是当你尝试casta char *或a char数组时int,编译器只会给你一个警告:
警告:从指针强制转换为不同大小的整数[-Wpointer-to-int-cast]
对于char *你得到一个恒定int值 - 我相信它与指针或内存有关 - 然后对于一个char数组你总是得到一些变量int值.
char* foo = "baz";
int bar = (int)foo;
printf("%i",bar);
char qux[]="something";
int bar2 = (int)qux;
printf("%i",bar2);
Run Code Online (Sandbox Code Playgroud)
这可能听起来像是一个不必要的问题,但我想知道原因.
尝试将指针转换为某种整数类型可能会导致未定义的行为 (UB).
任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.* ...C11dr§6.3.2.36
(int)foo由于UB潜力,可以生成类似"警告:从指针转换为不同大小的整数"的警告. @ 4386427
char* foo = "baz";
int bar = (int)foo; // potential UB.
Run Code Online (Sandbox Code Playgroud)
要避免该UB,在将对象指针转换为整数(不是函数指针)时,请使用可选类型 uintptr_t或intptr_t.
下面的类型指定一个无符号整数类型,其属性是任何有效指针
void都可以转换为此类型,然后转换回指向void的指针,结果将比较原始指针:
uintptr_t
7.20.1.4 1
例
#include <inttypes.h>
some_object* foo = ...;
uintptr_t bar = (uintptr_t)(void*)foo; // no UB
printf("0x%" PRIXPTR "\n", bar);
Run Code Online (Sandbox Code Playgroud)
对于char数组,您总是得到一些变量int值.
那是因为数组的转换,首先转换为指向第一个元素的指针,然后转换为整数. int bar2 = (int)qux;试图获取数组存在的值,而不是元素值.
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |