C++ 在函数内声明字符数组时出现分段错误
今天,我在编写一些C/C++代码时遇到了一个奇怪的行为,我想知道这是什么解释 这里有两个代码片段显示相同的函数,第一个在函数外部声明了静态数组“char comp[BUFFLEN];”,而第二个在函数内部声明。BUFFLEN的定义大小为1024。 我所指的奇怪行为是:第一个函数运行完美,并提供预期的输出,而第二个函数用segfault压碎。 我知道错误在哪里——在复制之前我没有为k分配内存(显然,在修复之后,两个变体都工作得很好),但我希望有人能告诉我发生了什么,以及为什么我没有得到第一个变体的错误。谢谢C++ 在函数内声明字符数组时出现分段错误,c++,arrays,segmentation-fault,C++,Arrays,Segmentation Fault,今天,我在编写一些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是什么意思即使你知道你所列出的所有内容,即使在不同的运行条件下,程序也会有不同的。不要传播错误的信息。我不习惯于思考不明确的行为,尽管我知道它存在。将来我会考虑这一点。谢谢!