gpt4 book ai didi

c++ - 在函数内部声明 char 数组时出现段错误

转载 作者:行者123 更新时间:2023-11-28 06:16:04 24 4
gpt4 key购买 nike

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

这里有两个显示相同功能的代码片段,第一个有静态数组“char comp[BUFFLEN];”在函数外部声明,而第二个在函数内部声明。 BUFFLEN 定义为尺寸 1024。我指的奇怪行为是这样的:第一个函数运行完美并提供预期的输出,而第二个函数因段错误而崩溃。我知道错误在哪里 - 我在复制之前没有为 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);
}

如果标题不合适,我很抱歉,我试着想出一些真正有人会用谷歌搜索的东西。

最佳答案

只看你的代码而不详细检查就会发现一个明显的问题

  1. 您不检查 strtok() 是否返回了 NULL,取消引用 NULL 指针是未定义的行为,故障线路是

    char* p = strtok(pathc, "/");

    然后您 strcpy() 紧随其后的是“ token ”。

  2. 您没有为 k 分配空间,所以 k 没有初始化并且它包含垃圾,试图写入“地址"它指向的是未定义的行为

问题可能会在这一行出现

strcpy(k, p)

时,无法预测程序的行为,但您可以预期当在不同位置声明/定义变量时它的行为会有所不同,因为程序布局会有所不同并且行为通常取决于

你也像一个 c 程序一样工作,虽然它显然是一个 c++ 程序,但 c++ 程序员不会使用 strtok()char 指针来处理字符串,c 程序员对此几乎无能为力,必须处理这些事情,因为您使用的是 c++ 编译器我建议 std::string 并且您可以拆分字符串,不用担心关于分配内存等

关于c++ - 在函数内部声明 char 数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30287029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com