c++ 为什么这个程序会在main中输出错误的字符串值?[已关闭]

fzsnzjdm  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(95)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
下面的代码在parameters函数中输出正确的字符串,但在main中输出不正确的字符串。
很明显出了点问题,但我看不出是什么。谢谢。

#include <iostream>
#include <string>

using namespace std;

typedef struct sim {
    
    const char* dir;

} sim;

string convertToString(char* a)
{
    string s(a);
    return s;
}

int parameters(sim *sdata, char **argv, int argc){

    char *filename;
    string token;
    string delimiter = "=";
    size_t pos = 0;
    string s;

    for (int i = 0; i < argc; ++i){

        s = convertToString(argv[i]);

        while ((pos = s.find(delimiter)) != string::npos) {
            token = s.substr(0, pos);
            s.erase(0, pos + delimiter.length());
        }

        if(token == "-dir"){
            sdata->dir = s.c_str();
            cout << sdata->dir << endl;
        } 

    }

}

int main(int argc, char** argv) {

    sim * sdata = (sim*)malloc(sizeof(sim));
    
    parameters(sdata, argv, argc);
    
    cout << sdata->dir << endl;
    
    free(sdata);
    
    return 0;
}

我用./teststring-dir =/home/stephen启动了这个程序,得到了:
/首页/斯蒂芬
我原以为两个输出是一样的。

ryoqjall

ryoqjall1#

程序具有未定义的行为。
指针sdata->dir在退出函数parameters后将无效,因为对象s将不活动。它只有函数的块作用域。
同样使用操作符newdelete,而不是调用C函数malloc

sim * sdata = new sim;

您可以在函数中编写如下内容

if ( token == "-dir" )
    {
        sdata->dir = new char[s.length() + 1 ];
        strcpy( sdata->dir, s.c_str() );
        cout << sdata->dir << endl;
    }
    else
    {
        sdata->dir = nullptr;
    }

假设数据成员dir是在没有限定符const的情况下声明的。

typedef struct sim {
    
    char* dir;

} sim;

在C++中,在结构声明中使用typedef说明符也是多余的。
所以总的来说你需要写

delete [] sdata->dir;
delete sdata;

相关问题