我正在尝试获取父目录的统计信息。
如果我像下面这样写代码,则返回error: Bad address
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <dirent.h>
int main(int agrc, char * argv[]){
struct stat *buffer;
int res = stat("..", buffer);
if(res != 0){
perror("error");
exit(1);
}
//printf("%d", buffer->st_ino);
}
但是,如果我在下面编写这样的代码,那就没有问题。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <dirent.h>
int main(int agrc, char * argv[]){
/* struct stat *buffer; */
struct stat buffer;
int res = stat("..", &buffer);
if(res != 0){
perror("error");
exit(1);
}
//printf("%d", buffer->st_ino);
printf("%d", buffer.st_ino);
}
我不知道为什么结果会有所不同。
定义buffer
的变量struct stat * buffer
是struct stat
的指针
&buffer
也是struct stat
的指针
该功能在手册页中定义如下
SYNOPSIS
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *buf);
...
我希望结果都能成功,为什么结果不同?任何人都可以提供帮助,非常感谢。
答案 0 :(得分:4)
使用struct stat buffer;
,在堆栈上为buffer
分配了内存。
但是对于struct stat *buffer;
,没有为buffer
分配内存。您必须使用内存分配功能来分配内存。这种分配发生在所谓的堆上。
struct stat *buffer = malloc(sizeof(struct stat));
请注意,[expr.pre]/4统计path
指向的文件并填写buf
。因此,如果buf
没有指向程序所拥有的内存,它将导致error: Bad address
。