![](/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.