所以我有两个简单的程序。它们非常相似,但是一种代码可以正常工作,而另一种则根本不工作。这里有人知道为什么吗?
即使char *名称未初始化,此代码也可以正常工作。
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
DIR* d;
struct dirent* dir;
char* name;
d=opendir(".");
if(d){
while((dir=readdir(d))!=NULL){
strcpy(name,dir->d_name);
printf("%s\n",name);
}
clode(dir);
}
return 0;
}
第二个代码在声明部分有微小差异,这导致变量“名称”不可访问。
int main(int argc, char* argv[]){
DIR* d;
struct dirent* dir;
char* surname = "Surname";
char* name;
d=opendir(".");
if(d){
while((dir=readdir(d))!=NULL){
strcpy(name,dir->d_name);
printf("%s\n",name);
}
clode(dir);
}
return 0;
}
运行第二个代码时,我在strcpy(name,dir->d_name)
之后立即收到“ Segmentation fault”消息,当我尝试在GDB调试器下打印变量“ name”时,得到了消息$1 = 0x1 <error: Cannot access memory under address 0x1>
。
为什么此错误消息没有出现在第一个程序中?声明会导致这种运行时错误的char* surname = "Surname";
有什么大不了的?
P.S。我知道在此示例中,我从不使用变量“姓”,并且我知道此代码中不需要strcpy(name,dir->d_name)
。该代码是更大的代码的一部分,并且是由于提取了导致错误的重要部分(试图生成最少的代码集)而导致的。
谢谢。 问候
答案 0 :(得分:1)
由于名称尚未初始化,因此尝试使用strcopy是未定义的行为。这意味着无论发生什么都是不可预测的错误代码(这并非表示将会失败,只是可能发生坏事而应该失败。通常,UB 可能仍然可以解决,这可能就是发生的情况。)
解决该错误的一种方法是:
{{1}}
答案 1 :(得分:1)
char* name;
未初始化...指向的位置未定义。它可能会起作用。在可能不会。
添加char* surname = "Surname"
会稍微改变变量,允许 name 指向其他位置。
您真正需要的是类似char name[NAME_MAX]
的东西来分配可预测的存储空间。