首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么传递char[]不起作用,但是(不推荐的转换) char*起作用?

为什么传递char[]不起作用,但是(不推荐的转换) char*起作用?
EN

Stack Overflow用户
提问于 2013-09-04 14:41:39
回答 3查看 151关注 0票数 0

我无法解释以下行为的原因。我初始化了两段文本,一个是char*,另一个是char[],并将它们放入一个结构中。两者在结构上看起来都很好,但是在main中,第二个丢失了,第一个给了我一个我理解的编译器警告(从字符串常量到char*的不推荐转换)。

这是我在这里提出的第一个问题,我对任何做错的事情表示歉意。是的,我试着搜索,但是与char*和char[]有关,出现了大量的Q&A,没有一个类似于我正在处理的嵌套问题。

从附加的代码中,我得到了输出:

代码语言:javascript
运行
复制
get_struct: 5 test test2
main: 5 test

(结尾处的test2丢失)

所以密码:

代码语言:javascript
运行
复制
    #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;
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-04 14:45:04

您有一个问题,就是在结构中存储指向局部变量的指针。

对于test_char2数组,一旦get_struct函数返回,它就不再存在。这意味着指针a_char2不再指向有效的字符串,取消引用此指针是未定义的行为。

第一个指针之所以工作,是因为它没有指向局部变量,而是指向字符串文本,而这些字符串存储在内存的其他地方。

在C++中编码时,不再需要为字符串使用指针或数组,而是使用std::string类。

票数 3
EN

Stack Overflow用户

发布于 2013-09-04 14:54:45

代码语言:javascript
运行
复制
char* test_char1 = "test";

这将创建一个指向字符串文本的指针。字符串文字是const,但由于历史原因,该语言允许指针不是const;但是,这是不可取的,因此需要警告。如果尝试修改字符串,则会得到未定义的行为。

代码语言:javascript
运行
复制
char test_char2[] = "test2";

这将创建一个本地数组,通过复制字符串文字进行初始化。它不是const,所以如果您愿意,可以修改它。但是,一旦函数返回,它就被破坏了,所以您的结构以一个指向无效内存的悬空指针结束。这就是为什么当您尝试在main中打印它时,会得到未定义的行为。

有两条建议:

  • 不要使用C风格的字符数组和指针来表示字符串;使用std::string。它为您管理内存,避免您在这里遇到的终生问题。
  • 如果您真的想处理数组和指针,请使用const char*,除非您确实需要修改它。否则,很难使用字符串文本。
票数 2
EN

Stack Overflow用户

发布于 2013-09-04 14:46:31

当将字符串文本分配给本地char[]-variable时,存储将在本地分配。

从该范围导出指针违反了局部变量的(自动)存储持续时间约束,并且访问指针后面的内存是未定义的行为。

相反,当分配给char*时,将创建指向静态分配字符串的指针,并且不会复制到本地存储。因此,指针在该范围外仍然有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18616876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档