这是一个函数调用(因此它只是整个程序的一部分)。它会产生分段错误。我想这是由“指针是一个局部变量”引起的?
int fileExists(const char *fname){
int i = 0;
fseek(fs, sizeof(NODE)*i, SEEK_SET);
NODE* pointer;
fread(pointer, sizeof(NODE), 1, fs);
return 1;
}
更新:
typedef struct node {
char fname[MAX_NAME];
short fstart;
} NODE;
int findStart (const char *fname){
fs = fopen("Directory", "w+");
NODE* pointer = malloc(sizeof(NODE));
int i;
for(i=0;i<numberNodes;i++){
fseek(fs, sizeof(NODE)*i, SEEK_SET);
fread(pointer, sizeof(NODE), 1, fs);
if(strcmp(pointer->fname, fname)==0)
return pointer->fstart;
}
return 0;
}
因此,如果我想运行目录文件中的节点并找到正确节点的“fstart”,我是否可以实现这一点而无需释放分配给“指针”的内存?
答案 0 :(得分:4)
问题在于:
NODE* pointer;
fread(pointer, sizeof(NODE), 1, fs);
您从未为NODE
分配任何空格。
NODE* pointer = malloc(sizeof(NODE));
但是,我不确定你的目的是什么,因为你立即离开了这个功能。不要忘记稍后free
指针。
根据函数fileExists
的名称,您可能需要做的只是尝试打开文件,检查文件是成功还是失败,然后返回。这里的所有代码都是不必要的。
这样的事情(几乎)会做我认为你想要的事情:
int fileExists(const char *fname){
FILE *file = fopen(fname,"r");
if (file == NULL)
return 0;
fclose(file);
return 1;
}
编辑:回答新问题。
要完全避免malloc
,首先可以将NODE
作为局部变量放在堆栈中:
int findStart (const char *fname){
fs = fopen("Directory", "w+");
NODE node;
int i;
for(i=0;i<numberNodes;i++){
fseek(fs, sizeof(NODE)*i, SEEK_SET);
fread(&node, sizeof(NODE), 1, fs);
if(strcmp(node.fname, fname)==0)
return node.fstart;
}
return 0;
}