我们能打印出字符串文字的地址吗?
我做了谷歌,我意识到有人说它可以说它不能。
我想validation一下。
例如
char gchararr1i[] = "testing 123"; // global char array init char *gptr1i = "hello", *gptr2ui; // global char pointer init and un-init float gfloati = 123.4; // global float var init double gdoubleui; // global double var un-int int main(int argc, char *argv[]) { printf("\n Address of string literals \"testing 123\" = %p and \"hello\" = %p \n", gchararr1i, gptr1i);// output the addresses of string literals "testing 123" and "hello" f1(10, -20, 30.3, 'A', 45.67); exit(0); }
您可以获取字符串文字的地址,但不能确定具有完全相同内容的两个字符串文字将位于同一地址(或者它们将不具有相同的地址)。 在这方面,编译器工具链可以自由地进行。
该标准甚至允许一个字符串文字与另一个字符串共享内存。 例如, "world"
的地址可能“指向”文字"hello world"
。 我不知道这样做的实现,但我也没有检查过它。
我们能打印出字符串文字的地址吗?
是。 打印字符串文字地址的简单示例。
printf("%p\n", (void *) "Hello Word!");
产量
0x100403055
以下打印出gchararr1i[]
的第一个元素的地址。 这可能是也可能不是字符串文字的地址。 字符串文字甚至可能不在代码中单独存在。
char gchararr1i[] = "testing 123"; printf("%p\n", (void *) gchararr1i);
产量
0x22caa0
下面打印出指针gptr1i
的地址值,它恰好是字符串文字"hello"
的地址。
char *gptr1i = "hello"; printf("%p\n", (void *) gptr1i);
产量
0x100403060
–
细节: "%p
仅用打印void*
指针定义。当打印除void*
之外的对象指针时,首先转换为void *
。 @ user3386109 。注意:打印函数指针请看这个 。
int x; // printf("%p\n", x); printf("%p\n", (void *)&x);