gpt4 book ai didi

c - 仅循环外的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:26 27 4
gpt4 key购买 nike

在 Linux 上使用 C,我正在编写一个代码,使用函数 stat() 将有关文件的所有信息存储在一个目录中,并在终端上打印它们该算法非常简单,我制作了一个"file"结构数组并动态分配它们。该结构包含一个字符数组(字符串),所以我也动态分配了它。问题是..动态分配工作正常,但如果我在 while 循环内,我可以访问结构内的另一个元素——这是一个结构 stat 对象——但如果我在循环完成后访问它,它会给我“分段故障”!这是代码

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
struct file{
char* name;
struct stat fbuf;
};


int main(int argc, char **argv)
{
char* dir=NULL;
int k;
dir=(char *)malloc(strlen(argv[argc-1])+1);
dir=argv[argc-1];
strcpy(dir,argv[argc-1]);
DIR *curr_dir;
struct dirent *dir_inode;
int i,j=0;
char* sum=NULL;
struct file* files=NULL;
if ((curr_dir = opendir(dir)) == NULL) {
fprintf(stderr, "Can't Open %s\n", argv[1]);
exit(2);
}
while (((dir_inode = readdir(curr_dir))) != NULL) {


files=(struct file*) realloc(files,((j)+1)*(sizeof(char*)+sizeof(struct stat))); // Structure array reallocation

(files+(j))->name=(char *)(malloc(strlen(dir_inode->d_name)+1));//name allocation



for(i=0;i<strlen(dir_inode->d_name);i++)
(files+(j))->name[i]=dir_inode->d_name[i];//name storage
(files+(j))->name[i]='\0';

sum= (char *) malloc(strlen(dir)+strlen(dir_inode->d_name)+2);//To add file name to its directory

for(i=0;i<strlen(dir);i++)
sum[i]=dir[i];

sum[i]='/';
i++;
for(k=0;dir_inode->d_name[k]!='\0';k++)
sum[i+k]=dir_inode->d_name[k];
sum[i+k]='\0';//file name with directory in sum


if( stat(sum,&((files+j)->fbuf)) == -1){ // the function gets information from the file name and stores them in fbuf
printf("error stat\n");
exit(1);
}


free(sum);
if( S_ISDIR( ( (files+(j))->fbuf ).st_mode ) ){
printf("d");
}
else {
printf("-");
}
//Here the output appears fine
//The output depends on accessing fbuf in files array
printf("statOK\n");
(j)++; // index
}
printf("%d %d %d\n",files,j,files+1);



printf("%d\n",j);





printf("\n\n\n\n");
for(i=0;i<j;i++){
printf("%s\n",(files+i)->name);
printf("%d\n",files);
//Starting from here, same syntax but outside the loop it gives the error
if( S_ISDIR( ( (files+i)->fbuf ).st_mode ) ){
printf("d");

else {
printf("-");
}
}
free(files);
free(dir);
closedir(curr_dir);
exit(1);

}

代码还没有完成,但我只想在循环外访问 fbuf,然后我就可以完成它有什么想法吗?

最佳答案

错误的大小假设

这个分配是错误的:

files=(struct file*) realloc(files,((j)+1)*(sizeof(char*)+sizeof(struct stat)));

在这里,您假设 struct file 的大小是其两个组件大小的总和。但实际上,您不知道该结构是如何打包和对齐的,因此 struct file 的大小可能比您想象的要大。您应该只使用 sizeof(struct file) 代替:

files=(struct file*) realloc(files,(j+1)*(sizeof(struct file)));

关于c - 仅循环外的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321996/

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