gpt4 book ai didi

c - 在C中打印字符串的地址是否有效

转载 作者:太空狗 更新时间:2023-10-29 16:34:00 24 4
gpt4 key购买 nike

我有 2 个问题...(我正在学习 C,这可能是一些愚蠢的问题。抱歉)

  • 根据 How to declare strings in C在大多数书中,他们总是说声明一个字符串,即使你是通过说

    来分配内存
    char p2[] = "String";

我的问题是,有没有办法声明一个字符串?

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

printf("%p\n", &"Hello There"); // I tried, it prints some address

通过这样做

printf("%p\n", &"Hello There");
printf("%p\n", &"Hello There");

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

最佳答案

C 标准,§6.4.5 字符串文字,说:

It is unspecified whether these arrays are distinct provided their elements have the appropriate values.

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

// main.c
#include <stdio.h>

extern void print_foo_addr(void);

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

// printfoo.c
#include <stdio.h>

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

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

关于c - 在C中打印字符串的地址是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19027566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com