我们能打印出字符串文字的地址吗?

时间:2016-04-02 03:20:27

标签: c

我做了谷歌,我意识到有人说它可以 有人说它不能。

我想验证一下。

例如

 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);               
}

2 个答案:

答案 0 :(得分:7)

您可以获取字符串文字的地址,但您无法确定具有完全相同内容的两个字符串文字将位于同一地址(或者他们不会拥有相同的地址)。在这方面,编译器工具链可以自由地进行。

标准甚至允许一个字符串文字与另一个字符串共享内存。例如,"world"的地址可能会指向'文字"hello world"。我不知道这样做的实现,但我也没有检查过它。

答案 1 :(得分:4)

  

我们能打印出字符串文字的地址吗?

是。打印字符串文字地址的简单示例。

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。注意:要打印函数指针,请参阅this

int x;
// printf("%p\n", x);
printf("%p\n", (void *)&x);