![](/img/trans.png)
[英]Why can I take the address of a string literal, but not of an integer literal?
[英]How can I find the address of a String Literal?
假设我有以下内容:
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细绳)?
如何找到字符串文字的地址?
您已找到字符串文字的地址。 字符串文字的值是它的第一个字符的地址。 您将该值分配给a
和b
。
我可以说使用的总内存是 sizeof (a) 而不是 2*sizeof (a) 吗?
首先这个问题格式不正确。 sizeof(a)
是指针的大小。
你想问:
我可以说用于字符串文字的总内存是字符串的一个副本所需的大小,而不是字符串的两个副本所需的大小吗?
不,这是编译器的一个实现细节。 它可以选择实习字符串或不随心所欲。 如果您修改其中一个字符串,则是否观察到另一个字符串被修改由实现定义。
这是一个更普遍的事实的结果,即如果您修改其中一个字符串,它是由实现定义的会发生什么,周期。 任何事情都可能发生。
我对字符串文字的理解是存储一个字符串副本。
你的理解是错误的。 这不是语言的保证。 这是编译器可以选择进行或不进行的优化。
是不是存储在 a, a+1, a+2 ..... a + 12 内存地址和 b, b + 1, b + 2 ... b + 12 之间(12 是 sizeof细绳)?
我无法理解这个问题。 没有被存储的“它”是什么?
以下代码将向您显示变量所在的位置以及字符串所在的位置
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 );
请注意,最后两行可能会也可能不会打印相同的地址,具体取决于编译器。 不要求编译器只创建一个字符串。
你可以自己检查一下。 例如
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 是 sizeof细绳)? --> 使用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++ 中执行此操作以确定字符串文字的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.