【发布时间】:2019-01-25 01:03:33
【问题描述】:
所以我有两个简单的程序。它们非常相似,但是一种代码可以正常工作,而另一种则根本不起作用。这里有人知道为什么吗?
尽管没有初始化 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;
}
第二个代码在声明部分有细微差别,这导致变量“name”无法访问。
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) 之后立即收到“分段错误”,当我尝试在 GDB 调试器下打印变量“名称”时,我收到消息 $1 = 0x1 <error: Cannot access memory under address 0x1>。
为什么这个错误信息没有出现在第一个程序中?声明 char* surname = "Surname"; 会导致这种运行时错误有什么大不了的?
附:我知道在这个例子中我从不使用变量 'surname' 并且我知道在这段代码中不需要strcpy(name,dir->d_name)。此代码是更大代码的一部分,这是提取导致错误的重要部分的结果(试图生成更小的代码集)。
谢谢。 问候
【问题讨论】:
-
没有为
char* name;分配内存,所以strcpy(name,dir->d_name)将失败。 “尽管char* name没有初始化,但第一个代码工作没有问题。”这是一个不幸的中断,未定义行为的一个结果是代码显然可以工作。 -
有用的问题是,“
name与char* name; ....strcpy(name,dir->d_name);有什么价值。由于指针name从未被分配任何东西,strcpy(name,...正在接收垃圾。