c-声明意外行为



所以我有两个简单的程序。它们非常相似,但其中一个代码工作得很好,另一个根本不工作。这里有人知道为什么吗?

尽管char*name没有初始化,但这段代码工作起来没有问题。

#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("%sn",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("%sn",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";会导致这种运行时错误,这有什么大不了的?

第页。S.我知道在这个例子中,我从不使用变量"姓氏",并且我知道在这段代码中不需要strcpy(name,dir->d_name)。这段代码是更大代码的一部分,这是提取导致错误的重要部分的结果(试图生成一组更小的代码)。

谢谢。问候

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

添加char* surname = "Surname"会稍微改变您的变量,允许name指向其他地方。

您真正需要的是像char name[NAME_MAX]这样的东西来分配可预测的存储。

由于名称未初始化,尝试将strcopy与之一起使用是未定义的行为。这意味着无论发生什么都是不可预测的和糟糕的代码(这并不意味着它失败,只是坏事可能会发生,它应该会失败。一般来说,UB可能最终仍会成功,这可能就是发生的事情。)

你可以修复这个错误的一种方法是:

int main(int argc, char* argv[]){
DIR* d;
struct dirent* dir;
char* surname = "Surname";
char* name = NULL;
d=opendir(".");
if(d){
while((dir=readdir(d))!=NULL){
name = realloc(name, strlen(d->name)+1); // Needs to be one char longer 
// to account for the null terminator.
strcpy(name,dir->d_name);
printf("%sn",name);
}
free(name);
clode(dir);
}
return 0;
}

相关内容

最新更新