如何查找字符串文字的地址

How can I find the address of a String Literal?

本文关键字:字符串 文字 地址 查找 何查找      更新时间:2023-10-16

假设我有以下内容:

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

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

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

它不是存储在a、a+1、a+2之间吗。。。。。存储器中的a+12地址以及b、b+1、b+2。。。内存中的b+12(12是字符串大小(?

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

找到字符串文字的地址字符串文字的值是其第一个字符的地址。您已将该值指定给ab

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

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

你想问:

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

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

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

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

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

它不是存储在a、a+1、a+2之间吗。。。。。存储器中的a+12地址以及b、b+1、b+2。。。内存中的b+12(12是字符串大小(?

我不能理解这个问题。没有存储的"it"是什么?

以下代码将显示变量和字符串的位置

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

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

您可以自己检查。例如

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;

通常编译器有一些选项,可以控制两个相同的字符串文字是否会占用相同的内存,或者每个文字是否会分配到自己的内存区域。

我可以说使用的总内存是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是字符串大小(?-->使用gcc编译器,当字符串相等时,a和b是相同的地址。当字符串不同时,我发现不同的a和b是不同的地址。(嘿,这是一个有趣的练习。我学到了一些新东西(

#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++来确定字符串文字的地址。