假设我有以下内容:
char *a = "Learning CPP";
char *b = "Learning CPP";
我可以说使用的总内存是sizeof(a)而不是2 * sizeof(stringliteral)吗?
因为我对String文字的理解是存储了一个字符串副本。但是,
它是否存储在内存中的a,a + 1,a + 2 ..... a + 12地址之间,以及内存中的b,b + 1,b + 2 ... b + 12之间( 12是sizeof string)?
答案 0 :(得分:8)
如何找到字符串文字的地址?
您已找到字符串文字的地址。 字符串文字的值是其第一个字符的地址。您已将该值分配给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 string)?
我无法理解这个问题。什么是没有存储的“它”?
答案 1 :(得分:3)
以下代码将显示变量的位置以及字符串的位置
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 );
请注意,最后两行可能会也可能不会打印相同的地址,具体取决于编译器。不要求编译器只创建一个字符串。
答案 2 :(得分:1)
你可以自己检查一下。例如
if ( a == b ) std::cout << "The string literals are coinside" << std::endl;
else std::cout << "The string literals occupy different areas of memory" << std::endl;
通常编译器有选项允许控制两个相同的字符串文字将占用相同的内存,或者每个文字将在其自己的内存区域中分配。
答案 3 :(得分:1)
我可以说使用的总内存是sizeof(a)而不是2 * sizeof(a)吗? - &GT;不,sizeof(a)是sizeof(char *)= 4
它是否存储在内存中的a,a + 1,a + 2 ..... a + 12地址之间以及b,b + 1,b + 2 ... b + 12 in内存(12是字符串大小)? - &GT;使用gcc编译器,当字符串相等时,a和b是相同的地址。当字符串不同时,我发现不同的a和b是不同的地址。 (嘿,这是一个有趣的练习......我学到了新的东西)
答案 4 :(得分:0)
#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 ++来确定字符串文字的地址。