C++ 在函数内声明字符数组时出现分段错误

C++ 在函数内声明字符数组时出现分段错误,c++,arrays,segmentation-fault,C++,Arrays,Segmentation Fault,今天,我在编写一些C/C++代码时遇到了一个奇怪的行为,我想知道这是什么解释 这里有两个代码片段显示相同的函数,第一个在函数外部声明了静态数组“char comp[BUFFLEN];”,而第二个在函数内部声明。BUFFLEN的定义大小为1024。 我所指的奇怪行为是:第一个函数运行完美,并提供预期的输出,而第二个函数用segfault压碎。 我知道错误在哪里——在复制之前我没有为k分配内存(显然,在修复之后,两个变体都工作得很好),但我希望有人能告诉我发生了什么,以及为什么我没有得到第一个变体的

今天,我在编写一些C/C++代码时遇到了一个奇怪的行为,我想知道这是什么解释

这里有两个代码片段显示相同的函数,第一个在函数外部声明了静态数组“char comp[BUFFLEN];”,而第二个在函数内部声明。BUFFLEN的定义大小为1024。 我所指的奇怪行为是:第一个函数运行完美,并提供预期的输出,而第二个函数用segfault压碎。 我知道错误在哪里——在复制之前我没有为k分配内存(显然,在修复之后,两个变体都工作得很好),但我希望有人能告诉我发生了什么,以及为什么我没有得到第一个变体的错误。谢谢

char comp[BUFFLEN];
void gen_struct(char* path){
    char pathc[BUFFLEN];
    memset(comp, 0, BUFFLEN);
    comp[0] = '\0';
    strcpy(pathc, path);
    cout << path << endl;
    char* p = strtok(pathc, "/");
    char* k;
    strcpy(k,p);
    do{
        if(p == NULL){
            cout << "Write " << k << " to disk\n";
            break;
        }
        sprintf(comp, "%s/%s", comp, p);
        // strcat(comp, p);
        cout << "Making directory: " << comp << endl;
        // Sysops::mkdir(comp);
        strcpy(k,p);
        p = strtok(NULL, "/");
    }while(true);
}

void gen_struct(char* path){
    char pathc[BUFFLEN];
    char comp[BUFFLEN];
    memset(comp, 0, BUFFLEN);
    comp[0] = '\0';
    strcpy(pathc, path);
    cout << path << endl;
    char* p = strtok(pathc, "/");
    char* k;
    strcpy(k,p);
    do{
        if(p == NULL){
            cout << "Write " << k << " to disk\n";
            break;
        }
        sprintf(comp, "%s/%s", comp, p);
        // strcat(comp, p);
        cout << "Making directory: " << comp << endl;
        // Sysops::mkdir(comp);
        strcpy(k,p);
        p = strtok(NULL, "/");
    }while(true);
}
charcomp[BUFFLEN];
void gen_结构(char*path){
char-pathc[BUFFLEN];
memset(comp,0,BUFFLEN);
comp[0]='\0';
strcpy(路径c,路径);

仅仅查看代码而不进行详细检查就可以看出一个明显的问题

  • 您不检查
    strtok()
    是否返回
    NULL
    ,取消引用
    NULL
    指针是否为未定义行为,则错误行为

    char* p = strtok(pathc, "/");
    
    然后你就可以
    strcpy()
    token了

  • 您没有为
    k
    分配空间,因此
    k
    没有初始化,它包含垃圾,试图写入它指向的“地址”,这是未定义的行为

  • 该问题可能会在这条线路上出现

    strcpy(k, p)
    
    当到达时,不可能预测程序的行为,但是当变量在不同的位置声明/定义时,您可以预期它的行为会有所不同,因为程序布局会有所不同,而行为通常取决于此


    <>你也在工作,就像它是一个C程序,而它显然是一个C++程序,C++程序员不使用字符串<<代码> >代码> char < /Cord>指针,C++程序员对此几乎无能为力,必须处理这些事情,因为你使用C++编译器,我建议<>代码> STD::String ,你可以拆分字符串,不必担心内存分配等。

    没有解释不明确的行为。你要么使用Wron。语言或错误的对象来表示您的数据。@BlueMoon作为一名科学家,我会告诉您有一种解释,它并不总是一样的!行为未定义意味着它取决于特定的程序、平台、运行条件、内存布局等。但这并不意味着没有解释,而是意味着没有解释预测将要发生的事情的方法,因此它是未定义的。未定义的行为是未定义的行为。任何事情都可能发生,包括程序没有崩溃。@iharob
    行为未定义意味着它取决于特定的程序、平台、运行条件、内存布局等。
    真的吗?UB是什么意思即使你知道你所列出的所有内容,即使在不同的运行条件下,程序也会有不同的。不要传播错误的信息。我不习惯于思考不明确的行为,尽管我知道它存在。将来我会考虑这一点。谢谢!