簡體   English   中英

為什么兩個聲明的char *變量獲得相同的地址?

[英]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連接?)

他們甚至保留了相同的地址嗎? (我自己在調試器中添加了最后兩行(&)。那些顯示不同的地址...)

你在做什么是未定義的行為,因為completeStringsubstring都沒有指向實際分配的內存。 任何事情都可能發生;)

更確切地說:很可能由於你沒有為局部變量賦值,它們只是得到堆棧上的第一個值,這個值可能是隨機的,或者你的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 *中使用的字符數,或者你可以多考慮​​一下使它變得動態

您的代碼存在一些問題。 我會在這里列出 -

  1. 語句char *completeString; completeString定義為指向字符的指針。 您需要的是一個字符數組,用於存儲用戶輸入的字符串。

  2. 變量completeStringsubString分別是函數GetCompleteStringGetSubstring本地變量。 它們在堆棧上分配,並在函數返回時超出范圍。 如果您嘗試在main訪問它們,則會調用未定義的行為。 您需要使用new運算符分配空間來在堆上存儲字符串。 這會在堆上分配內存。 完成后,應使用delete[]運算符釋放此內存。

  3. 根據標准的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM