gpt4 book ai didi

c: ls -l 实现给出了未定义的行为

转载 作者:行者123 更新时间:2023-11-30 19:36:26 25 4
gpt4 key购买 nike

因此,对于一项作业,我需要在 c 中实现 ls -l 功能。我试图将所有信息放入字符串数组中,以便稍后可以操作数据。它在 while 循环内打印得很好,但如果我尝试在其他地方打印内容数组,它就会中断。什么会导致此错误?

int getContentsLong(const char *dir, char **contents)
{
DIR *dp = NULL;
struct dirent *dptr = NULL;
struct stat fileStat;

if (dir == NULL)
{
printf("ERROR\n");
return -1;
}
dp = opendir(dir);
if (dp == NULL)
{
printf("ERROR\n");
return -1;
}
int cnt = 0;
char toRtn[512];
char path[256];
while ((dptr = readdir(dp)) != NULL)
{
strcpy(path, dir);
strcat(path, "/");
strcat(path, dptr->d_name);
stat(path, &fileStat);
strcpy(path, " ");

//getting l info
//permissions
toRtn[0] = ((S_ISDIR(fileStat.st_mode)) ? 'd' : '-');
strcat(toRtn, (fileStat.st_mode & S_IRUSR) ? "r" : "-");
strcat(toRtn, (fileStat.st_mode & S_IWUSR) ? "w" : "-");
strcat(toRtn, (fileStat.st_mode & S_IXUSR) ? "x" : "-");
strcat(toRtn, (fileStat.st_mode & S_IRGRP) ? "r" : "-");
strcat(toRtn, (fileStat.st_mode & S_IWGRP) ? "w" : "-");
strcat(toRtn, (fileStat.st_mode & S_IXGRP) ? "x" : "-");
strcat(toRtn, (fileStat.st_mode & S_IROTH) ? "r" : "-");
strcat(toRtn, (fileStat.st_mode & S_IWOTH) ? "w" : "-");
strcat(toRtn, (fileStat.st_mode & S_IXOTH) ? "x" : "-");
strcat(toRtn, " ");

//links
char tmp[sizeof(long int)];
sprintf(tmp, "%d", fileStat.st_nlink);
strcat(toRtn, tmp);
strcat(toRtn, " ");

//owner and group names
struct passwd *pw = getpwuid(fileStat.st_uid);
struct group *gr = getgrgid(fileStat.st_gid);
if (pw != 0) strcat(toRtn, pw->pw_name);
strcat(toRtn, " ");
if (gr != 0) strcat(toRtn, gr->gr_name);
strcat(toRtn, " ");

//filesize
strcpy(tmp, " ");
sprintf(tmp, "%ld", fileStat.st_size);
strcat(toRtn, tmp);
strcat(toRtn, " ");

//last access time
strcpy(tmp, " ");
strftime(tmp, 200, "%b %d %H:%M", localtime(&fileStat.st_atime));
strcat(toRtn, tmp);
strcat(toRtn, " ");

//file/dir name
strcat(toRtn, dptr->d_name);
strcat(toRtn, " ");

//strcpy(contents[cnt], toRtn);
contents[cnt] = toRtn;
printf("%s\n", contents[cnt]);

strcpy(toRtn, " ");
cnt++;
}
return cnt;
}

我从

得到的输出
   printf("%s\n", contents[cnt]); 

行是:

drwxr-xr-x 30 justin justin 4096 Nov 22 20:18 .. 
drwxr-xr-x 2 justin justin 4096 Nov 22 20:18 .
-rw-r--r-- 1 justin justin 5676 Nov 22 20:18 ls.c
-rwxr-xr-x 1 justin justin 12172 Nov 22 20:18 ls

但是当我打印时

for (int i = 0; i < cnt; i++)
{
printf("%s ", contents[i]);
}

它不显示任何内容。如果我使用 strcpy(content, toRt​​n);我遇到了段错误。

最佳答案

原因是,对于不同的cnt值。

contents[cnt] = toRtn;  

用于(间接)将toRtn返回给调用者,其中toRtn是函数中的本地数组,因此当函数返回时不再存在。

这意味着,对于调用者来说,循环

for (int i = 0; i < cnt; i++)
{
printf("%s ", contents[i]);
}

反复尝试打印不再存在的 char 数组的内容。这会产生未定义的行为。

您的代码中还存在其他基本问题。您需要更好地理解指针和数组之间的关系(它们在某些情况下可以互换使用,但是当它们不可互换时,您的某些代码会互换使用它们)以及作用域的含义(将局部变量的地址返回到无论如何,调用者都是一个坏主意,因为当它包含的函数/作用域结束时,变量将不再存在。

关于c: ls -l 实现给出了未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com