首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C中打印字符串地址有效吗?

在C中打印字符串地址有效吗?
EN

Stack Overflow用户
提问于 2013-09-26 11:54:48
回答 4查看 6.5K关注 0票数 15

我有两个问题.(我正在学习C,这可能是愚蠢的问题。)(道歉)

  • 按照How to declare strings in C和大多数书籍中的说法,即使您正在分配内存,但它们总是声明一个字符串 char p2[] = "String";

我的问题是,是否有声明字符串?

被放置在只读区域,然后复制到数组中。这样打印字符串的地址在C中有效吗?

代码语言:javascript
运行
复制
printf("%p\n", &"Hello There"); // I tried, it prints some address

通过这样做

代码语言:javascript
运行
复制
printf("%p\n", &"Hello There");
printf("%p\n", &"Hello There");

它正在打印相同的地址。感觉是,它应该打印不同的地址。编译器在这里做一些优化吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-26 12:03:45

C标准,§6.4.5字符串文字,规定:

如果这些数组的元素具有适当的值,则未指定这些数组是否不同。

因此,具有相同内容的两个字符串文本可能表示相同的数组,并且打印它们的地址会给出相同的指针值两次。这取决于编译器和链接器;当我将以下程序编译成两个单独的模块时.

代码语言:javascript
运行
复制
// main.c
#include <stdio.h>

extern void print_foo_addr(void);

int main()
{
    printf("%p\n", &"foo");
    print_foo_addr();
    return 0;
}

代码语言:javascript
运行
复制
// printfoo.c
#include <stdio.h>

void print_foo_addr()
{
    printf("%p\n", &"foo");
}

..。然后我得到两个不同的指针值(Linux4.7.3),但是当我将print_foo_addr的定义放在main.c中时,我会得到两次相同的值。是的,这是标准明确允许的优化,但是GCC至少只在每个模块的基础上执行这个优化。

票数 14
EN

Stack Overflow用户

发布于 2013-09-26 11:59:12

这是C标准特别允许的。

6.4.5p5-6:

在翻译阶段7,值为零的字节或代码被附加到由字符串字面或文字产生的每个多字节字符序列中。然后使用多字节字符序列初始化一个静态存储时间和长度的数组,该数组仅足以包含该序列。..。 如果这些数组的元素具有适当的值,则未指定这些数组是否不同。

票数 3
EN

Stack Overflow用户

发布于 2013-09-26 11:59:58

"Hello There"是字符串文本,它将在string表中可用( "Hello There"printf中获得相同地址的原因)。

当你做的时候

代码语言:javascript
运行
复制
char p2[] = "String";

内存将被分配,“字符串”将被复制到新创建的内存中。但

char * p3 = "String";将指向只读部分.即字符串表。

在这种情况下,如果打印p3&"String"将是相同的

如果您打印p2&"String",则会打印不同的地址。因为p2是堆栈地址。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19027566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档