今天我在编写一些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);
}
如果标题不合适,我很抱歉,我试着去想某人实际上会谷歌。
答案 0 :(得分:1)
只是在不仔细检查的情况下查看代码就会显示出明显的问题
您不会检查strtok()
是否返回NULL
,取消引用NULL
指针是未定义的行为,错误的行是
char* p = strtok(pathc, "/");
在此之后和strcpy()
“令牌”。
您没有为k
分配空间,因此k
未初始化并且包含垃圾,尝试写入“地址”它指向to,未定义的行为。
此行可能会立即出现此问题
strcpy(k, p)
到达,不可能预测程序的行为是什么,但是当在不同的地方声明/定义变量时,你可以预期它的行为会有所不同,因为程序布局会有所不同,而且行为通常取决于在那。
你也在工作,好像它是ac程序,虽然它显然是一个c ++程序,c ++程序员不能使用strtok()
和char
指针的字符串,c程序员几乎没什么可做的它必须与这些东西一起工作,因为你使用的是c ++编译器,我建议std::string
你可以拆分字符串,不需要担心分配内存等等。