Xcode 4.2中简单C字符串的奇怪结果

Xcode 4.2中简单C字符串的奇怪结果,c,xcode,string,C,Xcode,String,真是难以置信 const char *cStr = "a"; printf("%s, %x", cStr, cStr); 结果: a, 11046 它首先打印cStr指向的字符串,然后打印其地址。不是真的难以置信 %x告诉printf需要一个十六进制值,因为您向它传递了一个指针,它将接受该地址并打印它 以下是: printf("%s, %x, %d", cStr, cStr, cStr); 还将以十进制形式打印地址 你期待什么cStr是一个指针,通常由一个数字表示,通常与int大小相同。因

真是难以置信

const char *cStr = "a";
printf("%s, %x", cStr, cStr);
结果:

a, 11046

它首先打印cStr指向的字符串,然后打印其地址。不是真的难以置信

%x
告诉printf需要一个十六进制值,因为您向它传递了一个指针,它将接受该地址并打印它

以下是:

printf("%s, %x, %d", cStr, cStr, cStr);

还将以十进制形式打印地址

你期待什么
cStr
是一个指针,通常由一个数字表示,通常与
int
大小相同。因此,printf()可以将此指针的值打印为int。如果系统中的sizeof(char*)>sizeof(int)或指针与int有不同的对齐方式,则11046不是实际的指针值,它可以是它的一部分,也可以是它附近内存中的其他内容。这段代码根据C标准调用未定义的行为。

这不是难以置信的,实际上是正确的。C不是强类型语言。例如,一个字符也是一个数字(对于8字节,它在0-255之间)。。。类似地,指针是一个数字(恰好是一个内存地址),但它只是一个数字。可以将指针视为sizeof(void*)字节的整数值。如果你决定把它当作一个数字(你确实这样做了),那么它的行为就像一。例如,尝试以下方法:

int main() { 
         char *s = "Hello World";
         char *p;

         for ( p = s; *p ; p++ ) {
                printf("p = %s, p = %x = %p, *p = %c = %u\n", p,  p, p, *p, *p);
         }

}

享受结果…

这到底是为什么难以置信!!?指针的大小和对齐方式不需要与int相同。十六进制值也不需要。。。但我猜,既然它适用于%x,它也适用于int。不管怎样,它是未定义的。代码不正确。你不太清楚在执行过程中到底发生了什么。但结果或多或少是可以预测的。