gpt4 book ai didi

c - getpwuid() 和 stat() 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:32 25 4
gpt4 key购买 nike

我有以下代码。它给我一个可用内存的问题,但我还没有弄清楚问题到底是什么。似乎 getpwuid(buf->st_uid);readdir(dirh); 或 stat 函数不兼容。有谁知道为什么吗?

buf = (struct stat*) malloc(sizeof(struct stat));        
for (dirp[i] = readdir(dirh); dirp[i] != NULL; dirp[++i] = readdir(dirh)){

ptr=(char *)malloc(sizeof(strlen(mydir)));

ptr=strdup(mydir);
strcat(ptr,dirp[i]->d_name);

stat(ptr,buf);
//modos();

getpwuid(buf->st_uid);
printf("\t%s\n",ptr);

//we free the buf memory
}

free(buf);
closedir(dirh);

最佳答案

ptr=(char *)malloc(sizeof(strlen(mydir)));
ptr=strdup(mydir);

充其量看起来有问题 :-)

您在第一个分配一些内存,然后在第二个分配更多内存时泄漏它。

即使这不是问题,我也从未见过范式:

sizeof(strlen(mydir))

在调用 malloc 时,您可能倾向于使用 sizeofstrlen()+1。我认为您所拥有的,即使有效,也只会为 size_t(strlen 的返回值)分配足够的空间。我在这方面可能是错的,但我认为这无关紧要,因为由于泄漏,您无论如何都没有使用该内存。

还有其他问题如:

  • getpwuid 应该返回您忽略的 struct passwd *
  • strdup 为您提供一个完全正确大小的字符串副本,然后您strcat 处理它,几乎肯定会损坏内存.

现在这是未经测试的,但我认为这可能是一个更好的起点:

struct stat buf;
struct dirent * direntp;
struct passwd * pwdp
for (direntp = readdir(dirh); direntp != NULL; direntp = readdir(dirh)) {
// Allocate enough space for directory, separator, file and nul character.

ptr = (char*)malloc (strlen(mydir) + 1 + strlen (direntp->d_name) + 1);

strcpy (ptr, mydir);
strcat (ptr,"/");
strcat (ptr, direntp->d_name);

stat(ptr, &buf);
//modos();

pwdp = getpwuid (buf.st_uid);
printf("\t%s\n",ptr); // prob. need something from pwdp printed here as well.

// Don't leak.
free (ptr);
}

closedir(dirh);

关于c - getpwuid() 和 stat() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3173532/

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