今天,我在编写一些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] = ' ';
strcpy(pathc, path);
cout << path << endl;
char* p = strtok(pathc, "/");
char* k;
strcpy(k,p);
do{
if(p == NULL){
cout << "Write " << k << " to diskn";
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] = ' ';
strcpy(pathc, path);
cout << path << endl;
char* p = strtok(pathc, "/");
char* k;
strcpy(k,p);
do{
if(p == NULL){
cout << "Write " << k << " to diskn";
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);
}
对不起,如果标题不合适,我试图想到某人实际上会Google。
只是查看您的代码而没有详细检查显示出明显的问题
-
您不检查
strtok()
是否返回NULL
,删除NULL
指针是 undefined行为,有故障的行是char* p = strtok(pathc, "/");
您
strcpy()
之后的" 令牌"。 -
您不为
k
分配空间,因此k
不是初始化的,它包含垃圾,试图写入" address ",它指向的是不确定的行为。
此问题可能会在此行
后立即发生strcpy(k, p)
达到,无法预测程序的行为是什么,但是当在不同位置声明/定义变量时,您可以期望它的行为会有所不同,因为程序布局将有所不同,并且行为通常取决于
您也在工作,好像是C程序一样,虽然它显然是C 程序,但C 程序员无法使用strtok()
和char
指针与字符串合作,C程序员对此无关紧要,并且必须处理此事情,并且必须处理此事,由于您使用的是C 编译器,我建议您使用std::string
,并且可以拆分字符串,而不必担心分配内存等。