【发布时间】:2014-04-30 13:54:14
【问题描述】:
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 整数 1 完整字符 * 0x00007fff5fbff928 *完整的字符'b' 子字符 * 0x00007fff5fbff928 *子字符'b' &complete char ** 0x00007fff5fbff8e8 &sub char ** 0x00007fff5fbff8e0为什么这两个变量被分配了同一个地址?我在这里想念什么? (为什么他们保留与 argv 相同的地址,我认为这只是为了与 CLI 交互?)
他们甚至保留相同的地址吗? (我自己将最后两 (&) 行添加到调试器中。它们显示不同的地址...)
【问题讨论】:
-
你永远不会为
char *分配内存。地址只是内存中的某个随机位置。 -
无关的挑剔:从技术上讲,
argv不应该是const。 -
删除了
c标签,这是C++,不是C。 -
@calccrypto 和 filmor:我没有看到任何示例(在我面向初学者的书籍和研究中)表明您需要在声明之外进行任何类型的分配。我需要在这里添加什么?
-
@Cornstalks:这是从调试器窗格复制和粘贴的。与苹果公司合作。 :-D