如何找到字符串文字的地址?

Posted

技术标签:

【中文标题】如何找到字符串文字的地址?【英文标题】:How can I find the address of a String Literal? 【发布时间】:2014-03-25 22:56:54 【问题描述】:

假设我有以下内容:

char *a = "Learning CPP";
char *b = "Learning CPP";

我可以说使用的总内存是 sizeof (a) 而不是 2*sizeof (stringliteral) 吗?

因为我对字符串文字的理解是存储了字符串的一份副本。但是,

它不是存储在内存中的 a, a+1, a+2 ..... a + 12 地址和内存中的 b, b + 1, b + 2 ... b + 12 之间吗( 12 是 sizeof 字符串)?

【问题讨论】:

变量ab 保存地址。它们是否相同取决于编译器(C 标准没有强加任何东西——不了解 C++) C++ 标准也没有强加任何东西。 VC++ 可以做任何一个,这取决于你的编译器选项。 (除了变量在 C++ 中必须是 const char* 的事实之外) Sizeof(a) 给出了名为 a 的指针的大小,而不是它所指向的事物的大小。 "编译器允许,但不是必须的,合并字符串文字。这意味着相同的字符串文字在通过指针比较时可能比较相等,也可能不相等。即使表达式 "foo" == " foo" 返回 true 是实现定义的。" en.cppreference.com/w/cpp/language/string_literal 【参考方案1】:

如何找到字符串文字的地址?

已经找到了字符串文字的地址。 字符串文字的值是它的第一个字符的地址。您将该值分配给 ab

我可以说使用的总内存是 sizeof (a) 而不是 2*sizeof (a) 吗?

首先,问题格式错误。 sizeof(a) 是指针的大小。

你想问:

我可以说用于字符串文字的总内存是一份字符串所需的大小,而不是两份字符串所需的大小吗?

没有。这是编译器的实现细节。它可能会随心所欲地选择实习或不实习。如果您修改其中一个字符串,则由实现定义是否观察到另一个字符串被修改。

这是一个更普遍的事实的结果,即如果您修改其中一个字符串,则由实现定义会发生什么,句号。任何事情都有可能发生。

我对字符串字面量的理解是存储了一个字符串的副本。

你的理解是错误的。这不是语言的保证。这是编译器可以选择进行或不进行的优化。

它不是存储在内存中的 a, a+1, a+2 ..... a + 12 地址和内存中的 b, b + 1, b + 2 ... b + 12 之间吗( 12 是 sizeof 字符串)?

我无法理解这个问题。什么是没有被存储的“它”?

【讨论】:

感谢您的回答。我的意思是字符串。碰巧a == b。所以我现在很清楚了。 可能你确实是想写“价值”,但我认为你的意思是“地址”。 @MooingDuck:我向你保证我没有。我们这里有一个变量的赋值。赋值将右手操作数的值转换为左手操作数的类型,然后对转换后的值进行赋值。那么问题是右手操作数的值是什么?而答案是:字符串第一个字符的地址。【参考方案2】:

下面的代码会告诉你变量在哪里,字符串在哪里

printf( "variable a is at address %p\n", &a );
printf( "variable b is at address %p\n", &b );
printf( "the string that a points to is at address %p\n", a );
printf( "the string that b points to is at address %p\n", b );

请注意,最后两行可能会或可能不会打印相同的地址,具体取决于编译器。不要求编译器只创建一个字符串。

【讨论】:

【参考方案3】:

您可以自己检查。例如

if ( a == b ) std::cout << "The string literals are coincide" << std::endl;
else std::cout << "The string literals occupy different areas of memory" << std::endl;

通常编译器有一些选项可以控制两个相同的字符串字面量是占用相同的内存还是每个字面量都分配在自己的内存区域中。

【讨论】:

是的。他们是这样。谢谢。我不知道为什么我自己没有想到这一点。 你的意思是“巧合”吗? @Smiley1000 谢谢。对不起。英语不是我的母语。【参考方案4】:

我可以说使用的总内存是 sizeof (a) 而不是 2*sizeof (a) 吗? --> 不,sizeof(a) 是 sizeof(char *) = 4

它不是存储在内存中的 a, a+1, a+2 ..... a + 12 地址和内存中的 b, b + 1, b + 2 ... b + 12 之间吗( 12 是 sizeof 字符串)? --> 使用gcc编译器,当字符串相等时,a和b是同一个地址。当字符串不同时,我发现不同的 a 和 b 是不同的地址。 (嘿,这是一个有趣的练习..我学到了一些新东西)

【讨论】:

【参考方案5】:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()

char const* p ="Hello"; 
printf("%d",p); //prints the address of the first byte. ie of 'H' 
cout<<p[0] // prints H
cout<<p[1] //prints e

您可以在 C 或 C++ 中执行此操作以确定字符串文字的地址。

【讨论】:

以上是关于如何找到字符串文字的地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GNU 汇编程序中使用字符串文字作为直接操作数(并将其移动到地址)?

找到文字javascript

char * 到字符串文字如何有效?

打字模块 - 字符串文字类型

Scala REPL:错误:';'预期但找到字符串文字

如何在 GCC 中将重复或相乘的字符串文字合并为一个 [重复]