繁体   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