c++ - 为什么传递 char[] 不起作用,但(不推荐转换)char* 起作用?

标签 c++

我无法解释自己出现以下行为的原因。我初始化了两段文本,一段为 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类。

关于c++ - 为什么传递 char[] 不起作用,但(不推荐转换)char* 起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616876/

相关文章:

c++ - 如何在 C++ 中获取预加载的模块名称

c++ - Microsoft 如何保护例如 Sql Server 二进制文件免受逆向工程?

c++ - 绘制折线会产生像素化线

c++ - 使用 MPFR 时如何在 Boost Multi precision 中设置舍入模式

c++ - 关闭时如何在控制台应用程序中中止 getchar

c++ - 如何使用 C++ 读取 MNIST 数据集?

android - 基于 Qt、Qml 和 C++ 的应用程序移植到 Android

来自编译器的c++类型错误消息,这是什么意思?

c++ - 在纹理数组中绘制Texture2D图集

c++ - C和C++如何在堆栈上存储大对象?