arm-linux gcc 指针 取值,GCC存储的字符串常量以及这些指针映射的位置在哪里?

这篇博客探讨了在Linux x86_64平台上,GCC编译器如何处理C程序中的字符串常量。作者通过示例代码展示了字符串常量在内存中的存储位置,并注意到它们的地址较低,暗示它们可能位于只读数据段。当字符串被声明为局部常量时,它们被视为变量而非真正的只读常量,因此在每次编译时会分配不同的内存地址。文章还提到了动态分配的内存与静态分配的内存之间的区别,并询问关于GCC生成代码和内存映射的更多信息。
摘要由CSDN通过智能技术生成

当我编译和我的Linux x86_64的机器,由GCC编译于下面的C程序运行:GCC存储的字符串常量以及这些指针映射的位置在哪里?

#include

int main(void)

{

char *p1 = "hello"; // Pointers to strings

char *p2 = "hello"; // Pointers to strings

if (p1 == p2) { // They are equal

printf("equal %p %p\n", p1, p2); // equal 0x40064c 0x40064c

// This is always the output on my machine

}

else {

printf("NotEqual %p %p\n", p1, p2);

}

}

我总是得到输出:

等于0x40064c 0x40064c

我理解字符串存储在一个常量表中,但与动态分配的内存相比,地址太低。

比较用下面的程序:

#include

int main(void)

{

char p1[] = "hello"; // char arrar

char p2[] = "hello"; // char array

if (p1 == p2) {

printf("equal %p %p\n", p1, p2);

}

else { // Never equal

printf("NotEqual %p %p\n", p1, p2); // NotEqual 0x7fff4b25f720 0x7fff4b25f710

// Different pointers every time

// Pointer values too large

}

}

两个指针不相等,因为这些是可以独立操纵两个阵列。

我想知道GCC如何生成这两个程序的代码,以及它们在执行过程中如何映射到内存。由于这已经记录了很多次,所以文档的任何链接都是受欢迎的。

2012-09-12

Xolve

+0

你总是可以在拆卸时达到最高点。这是一种很好的开发技巧,你需要在未来再做一次。 –

+0

您的示例代码中只有两个字符串:'equal%p%p \ n'和'NotEqual%p%p \ n'。 'p1'和'p2'只是字符数组变量,初始化为某个值,然后用作字符串。特别是,你仍然可以做'p1 [0] ='H'; p2 [0] ='J';'例如,没有任何问题。如果你希望'p1'和'p2'是字符串常量,可以使用'static const char p1 [] =“Hello”;'。至少GCC-4.6.3将局部常量数组视为变量,而不是真正的只读常量,因此需要“静态”。它不会合并字符串,所以它们有不同的指针。你正在使用哪种编译器? –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值