![](/img/trans.png)
[英]Why do these two integer variables and two double variables (seemingly) share the same address in memory?
[英]Why are two declared char* variables getting the same address?
TL; DR:為什么我的char *變量具有相同的值,即使我輸入了不同的值?
考慮這個非常短的計划:
char *GetCompleteString ()
{
char *completeString;
std::cout << "Please enter the complete string.\n";
std::cin.getline(completeString,100);
return completeString;
}
char *GetSubstring ()
{
char* substring;
std::cout << "Please enter the substring for which to search.\n";
std::cin.getline(substring,100);
return substring;
}
//////////////////////////////////////////////////
int main(int argc, const char * argv[])
{
char *complete, *sub;
complete = GetCompleteString();
sub = GetSubstring();
//diagnostic
std::cout << "Complete is " << complete << " and sub is " << sub;
//diagnostic
return 0;
}
現在,我為第一個字符串輸入“foo”,為第二個字符串輸入“bar”。 但輸出告訴我兩個變量是相同的。
Xcode調試器顯示兩個變量具有相同的地址,因此當我為bar分配值時,先前輸入的foo(它位於同一地址)采用相同的值。 以下是調試器窗格在程序退出之前顯示的內容:
argv const char ** 0x00007fff5fbff928 argc int 1 complete char * 0x00007fff5fbff928 *complete char 'b' sub char * 0x00007fff5fbff928 *sub char 'b' &complete char ** 0x00007fff5fbff8e8 &sub char ** 0x00007fff5fbff8e0
為什么這兩個變量被賦予相同的地址? 我在這里錯過了什么? (為什么他們保留與argv相同的地址,我認為這只是為了與CLI連接?)
他們甚至保留了相同的地址嗎? (我自己在調試器中添加了最后兩行(&)。那些顯示不同的地址...)
你在做什么是未定義的行為,因為completeString
和substring
都沒有指向實際分配的內存。 任何事情都可能發生;)
更確切地說:很可能由於你沒有為局部變量賦值,它們只是得到堆棧上的第一個值,這個值可能是隨機的,或者你的libc
的初始化就在那里。
您可以使用以下更新的代碼
char *GetCompleteString ()
{
char *completeString = (char*)malloc(sizeof(char)*numberofchars);
std::cout << "Please enter the complete string.\n";
std::cin.getline(completeString,100);
return completeString;
}
char *GetSubstring ()
{
char* substring = (char*)malloc(sizeof(char)*numberofchars);
std::cout << "Please enter the substring for which to search.\n";
std::cin.getline(substring,100);
return substring;
}
//////////////////////////////////////////////////
int main(int argc, const char * argv[])
{
char *complete, *sub;
complete = GetCompleteString();
sub = GetSubstring();
//diagnostic
std::cout << "Complete is " << complete << " and sub is " << sub;
//diagnostic
return 0;
}
我在你的函數中添加了內存分配調用。 numberofchars是你期望在char *中使用的字符數,或者你可以多考慮一下使它變得動態
您的代碼存在一些問題。 我會在這里列出 -
語句char *completeString;
將completeString
定義為指向字符的指針。 您需要的是一個字符數組,用於存儲用戶輸入的字符串。
變量completeString
和subString
分別是函數GetCompleteString
和GetSubstring
本地變量。 它們在堆棧上分配,並在函數返回時超出范圍。 如果您嘗試在main
訪問它們,則會調用未定義的行為。 您需要使用new
運算符分配空間來在堆上存儲字符串。 這會在堆上分配內存。 完成后,應使用delete[]
運算符釋放此內存。
根據標准的main
簽名應該是以下之一 - int main();
或int main(int argc, char *argv[]);
將這些更改應用於您的代碼,它是
#include <iostream>
#define MAX_LEN 100
char *GetCompleteString()
{
char *completeString = new char[MAX_LEN];
std::cout << "Please enter the complete string.\n";
std::cin.getline(completeString, MAX_LEN);
return completeString;
}
char *GetSubstring()
{
char* substring = new char[MAX_LEN];
std::cout << "Please enter the substring for which to search.\n";
std::cin.getline(substring, MAX_LEN);
return substring;
}
int main()
{
char *complete, *sub;
complete = GetCompleteString();
sub = GetSubstring();
std::cout << "Complete is " << complete << " and sub is " << sub;
delete[] sub;
delete[] complete;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.