(int)如何在char数组和char*上进行转换?

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)

这可能听起来像是一个不必要的问题,但我想知道原因.

chu*_*ica 5

尝试将指针转换为某种整数类型可能会导致未定义的行为 (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_tintptr_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;试图获取数组存在的值,而不是元素值.