簡體   English   中英

為什么傳遞char []不起作用,但是(不建議使用的轉換)char *起作用?

[英]why does passing char[] not work, but (deprecated conversion) char* does?

我無法解釋以下行為的原因。 我初始化了兩段文本,一個為char *,另一個為char []並將它們放入一個結構中。 兩者在結構上看起來都不錯,但是在main中,第二個丟失了,第一個給了我我理解的編譯器警告(不建議將其從字符串常量轉換為char *)。

這是我在這里提出的第一個問題,對於任何做錯的事情,我深表歉意。 是的,我嘗試搜索,但是與char *和char []有關,出現了很多問答,沒有發現與我遇到的嵌套問題類似的問題。

從附帶的代碼中,我得到輸出:

get_struct: 5 test test2
main: 5 test

(最后的test2丟失了)

所以代碼:

    #include <iostream> 

    typedef struct {
        double a_double;
        char* a_char1;
        char* a_char2;
    } testStruct;

    testStruct make_struct(double d, char* c1, char* c2) {          
        testStruct t;

        t.a_double = d;
        t.a_char1 = c1;
        t.a_char2 = c2;

        return t;
    }

    void get_struct(testStruct &t) {    
        char* test_char1 = "test";
        char test_char2[] = "test2";
        double test_double = 5;

        t = make_struct(test_double, test_char1, test_char2);

        std::cout << "get_struct: " << t.a_double << " " 
            << t.a_char1 << " " << t.a_char2  << std::endl;
    }

    int main() {
        testStruct t;
        get_struct(t);
        std::cout << "main: " << t.a_double << " " 
            << t.a_char1 << " " << t.a_char2 << std::endl;
        return 0;
    }

您有一個問題,就是在結構中存儲了指向局部變量的指針。

對於test_char2數組,一旦get_struct函數返回,該數組就不再存在。 這意味着指針a_char2不再指向有效的字符串,並且取消引用該指針是未定義的行為。

第一個指針起作用的原因是,它沒有指向局部變量,而是指向字符串文字,並且這些指針存儲在內存中的其他位置。

使用C ++進行編碼時,不再有理由使用指針或數組作為字符串,而不必使用std::string類。

char* test_char1 = "test";

這將創建一個指向字符串文字的指針。 字符串文字是const但是由於歷史原因,該語言允許指針為非const 但是,不建議這樣做,因此發出警告。 如果您嘗試修改字符串,則將獲得未定義的行為。

char test_char2[] = "test2";

這將創建一個本地數組,通過復制字符串文字進行初始化。 它不是const ,因此您可以根據需要進行修改。 但是一旦函數返回,它就會被銷毀,因此您的結構最終將帶有指向無效內存的懸空指針 這就是為什么嘗試在main打印時會出現未定義行為的原因。

兩個建議:

  • 不要使用C樣式的字符數組和指針來表示字符串; 使用std::string 這樣可以為您管理內存,避免您在此遇到的生命周期問題。
  • 如果您真的想弄亂數組和指針,請使用const char*除非您確實需要修改它。 否則,很難處理字符串文字。

將字符串文字分配給本地char[]變量時,該存儲將在本地分配。

從該范圍中導出該指針違反了局部變量的(自動)存儲持續時間約束,並且訪問指針后面的內存是未定義的行為。

相反,當分配給char* ,將創建指向靜態分配的字符串的指針,並且不會復制到本地存儲。 因此,指針在該范圍之外仍然有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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