C 将指向字符串文字的指针强制转换为int指针的结果是什么?
我现在不熟悉c编程语言和学习指南。我需要一点关于指针铸造的澄清C 将指向字符串文字的指针强制转换为int指针的结果是什么?,c,pointers,C,Pointers,我现在不熟悉c编程语言和学习指南。我需要一点关于指针铸造的澄清 #include<stdio.h> int main(){ char *c = "hello"; for(int i = 0;i<5;i++) printf("c:%c %d\n",c[i],c[i]); int *ip = (int*)c; printf("after casting"); printf("c:%d\n",*ip); return 0; } OUTPUT: c:h 104 c:e 10
#include<stdio.h>
int main(){
char *c = "hello";
for(int i = 0;i<5;i++)
printf("c:%c %d\n",c[i],c[i]);
int *ip = (int*)c;
printf("after casting");
printf("c:%d\n",*ip);
return 0;
}
OUTPUT:
c:h 104
c:e 101
c:l 108
c:l 108
c:o 111
after castingc:1819043176
#包括
int main(){
char*c=“你好”;
对于(int i=0;i您的程序执行了不允许的操作-将char
指针转换为int
指针。根据平台的不同,某些char
指针可能没有有效的int
指针表示形式,因此禁止转换;您看到的是未定义的行为
然而,对正在发生的事情有一个合理的解释。考虑将字符串复制到整数数组:
的程序。
int data[2] = {0};
strcpy((char*)data, "hello");
printf("%s\n", (char*)data);
printf("%d\n", data[0]);
这是允许的,因为int
指针可以在所有平台上转换为char
指针(事实上,标准要求所有对象指针都可以转换为char*
)
上面这个程序中的结果与您得到的值相匹配,即1819043176。这是一个特定于平台的数字,由重新解释“hello”的最初四个字节产生
作为整数。您的程序执行了不允许的操作-将char
指针转换为int
指针。根据平台的不同,某些char
指针可能没有作为int
指针的有效表示形式,因此禁止转换;您看到的是未定义的行为
然而,对正在发生的事情有一个合理的解释。考虑将字符串复制到整数数组:
的程序。
int data[2] = {0};
strcpy((char*)data, "hello");
printf("%s\n", (char*)data);
printf("%d\n", data[0]);
这是允许的,因为int
指针可以在所有平台上转换为char
指针(事实上,标准要求所有对象指针都可以转换为char*
)
上面这个程序中的结果与您得到的值相匹配,即1819043176。这是一个特定于平台的数字,由重新解释“hello”的最初四个字节产生
作为一个整数。您违反了严格的别名规则,您有未定义的行为。我建议您将强制转换的值打印为十六进制,并在附近保留一个字符(或者将单独的字符打印为十六进制)但是如果你将1819043176转换成十六进制,你会得到0x6C6568
。令人惊讶的是,这是'l'
,'l'
,'e'
,和'h'
的ASCII码。猜猜这些值来自哪里。@Someprogrammerdude是的,字符*
可以别名任何其他指针类型e、 但是,与此不同的是,char*
到int*
。您违反了严格的别名规则,您有未定义的行为。我建议您将强制转换的值打印为十六进制,并在附近保留一个字符(或者仅将单独的字符打印为十六进制)但是如果你将1819043176转换成十六进制,你会得到0x6C6568
。令人惊讶的是,这是'l'
,'l'
,'e'
,和'h'
的ASCII码。猜猜这些值来自哪里。@Someprogrammerdude是的,字符*
可以别名任何其他指针类型e、 但是,与这里发生的情况不同,char*
到int*
。