声明意外行为

时间:2019-01-25 01:03:34

标签: c strcpy fault

所以我有两个简单的程序。它们非常相似,但是一种代码可以正常工作,而另一种则根本不工作。这里有人知道为什么吗?

即使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)。该代码是更大的代码的一部分,并且是由于提取了导致错误的重要部分(试图生成最少的代码集)而导致的。

谢谢。 问候

2 个答案:

答案 0 :(得分:1)

由于名称尚未初始化,因此尝试使用strcopy是未定义的行为。这意味着无论发生什么都是不可预测的错误代码(这并非表示将会失败,只是可能发生坏事而应该失败。通常,UB 可能仍然可以解决,这可能就是发生的情况。)

解决该错误的一种方法是:

{{1}}

答案 1 :(得分:1)

char* name;未初始化...指向的位置未定义。它可能会起作用。在可能不会。

添加char* surname = "Surname"会稍微改变变量,允许 name 指向其他位置。

您真正需要的是类似char name[NAME_MAX]的东西来分配可预测的存储空间。