我还在学习C,所以请耐心等待。我收到一个异常错误,将指向文件的指针从函数传递回main()
。
代码如下:
#include "stdafx.h"
#include "FilMst5.c"
int main()
{
FilMstFilPtr = Opn("\\temp\\test.file", "wb"); // <- error occurs here
printf("filptr=0x%p\n", FilMstFilPtr);
return 0;
}
//******************************************************************************
// Open a file
//******************************************************************************
FILE * Opn(char PthNam[], char OpnMod[])
{
FILE * FilPtr = NULL;
errno = fopen_s(&FilPtr, PthNam, OpnMod);
if (errno != 0) {
printf("%s\n", PthNam);
perror("Could not open file");
return NULL;
}
printf("file opened for mode %s\n", OpnMod);
return FilPtr;
}
FilMst5.c包含文件是:
#pragma once
typedef struct {
int FilRRN;
unsigned long long FilOfs;
unsigned long long FilID;
char FilDir[10 + 1];
char FilNam[10 + 1];
char FilNamLcs[10 + 1];
char FilDirLcs[10 + 1];
char FilTypLcs[10 + 1];
char FilAtr[10 + 1];
char UsrID[10 + 1];
char SysID[8 + 1];
char FilSrcDir[10 + 1];
char FilSrcMbr[10 + 1];
} FilMstStc;
FilMstStc FilMst;
typedef struct {
unsigned long long RcdOfs;
} FilMstL1OfsStc;
FilMstL1OfsStc FilMstL1Ofs[250000000];
typedef struct {
unsigned long long RcdOfs;
} FilMstL1Stc;
FilMstL1Stc FilMstL1Key, FilMstL1SchKey;
typedef struct {
unsigned long long RcdOfs;
} FilMstL2Stc;
FilMstL2Stc FilMstL2[250000000];
typedef struct {
unsigned long long FilSID;
} FilMstL3Stc;
FilMstL3Stc FilMstL3Key, FilMstL3SchKey;
typedef struct {
unsigned long long RcdOfs;
} FilMstL4Stc;
FilMstL4Stc FilMstL4[250000000];
FILE * FilMstFilPtr;
FILE * Opn(char PthNam[], char OpnMod[]);
void WrtFilMstRcd(void)
{
}
从函数返回时我得到的错误是:
Unhandled exception at 0x000000013FA41971 in CrtFil5.exe: 0xC0000005:
Access violation writing location 0x000000012E0FEA08.
我期望得到的输出是:
file opened for mode wb
filptr=0x00000000######## <- pointer to file
我只得到第一行,因此函数中的return语句和实际返回值之间存在一些错误。
真正奇怪的是,如果删除FilMst5.c包含文件中的任何行,程序将按需运行。但我有一个更大的程序,使用例程,我不能删除随机行,试图让它工作。
什么可能导致这个问题?
我使用Visual Studio Community Edition 2015和Update 1,以x64模式编译。请告诉我任何有用的其他信息。
答案 0 :(得分:0)
强烈建议编写“便携式”代码,即使它只是在Windows环境中使用:
这是通过在文件前加上:
来实现的#define _CRT_SECURE_NO_WARNINGS
然后使用标准C库中的函数而不是windows.h
header / libraries中的函数
头文件:FilMst5.h内容应为:
#pragma once
typedef struct {
int FilRRN;
unsigned long long FilOfs;
unsigned long long FilID;
char FilDir[10 + 1];
char FilNam[10 + 1];
char FilNamLcs[10 + 1];
char FilDirLcs[10 + 1];
char FilTypLcs[10 + 1];
char FilAtr[10 + 1];
char UsrID[10 + 1];
char SysID[8 + 1];
char FilSrcDir[10 + 1];
char FilSrcMbr[10 + 1];
} FilMstStc;
typedef struct {
unsigned long long RcdOfs;
} FilMstL1OfsStc;
typedef struct {
unsigned long long RcdOfs;
} FilMstL1Stc;
typedef struct {
unsigned long long RcdOfs;
} FilMstL2Stc;
typedef struct {
unsigned long long FilSID;
} FilMstL3Stc;
typedef struct {
unsigned long long RcdOfs;
} FilMstL4Stc;
FILE * FilMstFilPtr;
FILE * Opn(char PthNam[], char OpnMod[]);
inline void WrtFilMstRcd(void)
{
}
// enable other files to access the variables declared in main.c
extern FilMstStc FilMst;
extern FilMstL1OfsStc FilMstL1Ofs[250000000];
extern FilMstL1Stc FilMstL1Key;
extern FilMstL1Stc FilMstL1SchKey;
extern FilMstL2Stc FilMstL2[250000000];
extern FilMstL3Stc FilMstL3Key;
extern FilMstL3Stc FilMstL3SchKey;
extern FilMstL4Stc FilMstL4[250000000];
extern FILE * FilMstFilPtr;
文件:(让我们称之为main.c
)
#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <stdio.h>
#include "FilMst5.h"
FilMstStc FilMst;
FilMstL1OfsStc FilMstL1Ofs[250000000];
FilMstL1Stc FilMstL1Key;
FilMstL1Stc FilMstL1SchKey;
FilMstL2Stc FilMstL2[250000000];
FilMstL3Stc FilMstL3Key;
FilMstL3Stc FilMstL3SchKey;
FilMstL4Stc FilMstL4[250000000];
FILE * FilMstFilPtr;
int main( void )
{
FilMstFilPtr = Opn("\\temp\\test.file", "wb"); // <- error occurs here
printf("filptr=0x%p\n", FilMstFilPtr);
return 0;
}
//******************************************************************************
// Open a file
//******************************************************************************
FILE * Opn(char PthNam[], char OpnMod[])
{
FILE * FilPtr = NULL;
errno = fopen_s(&FilPtr, PthNam, OpnMod);
if (errno != 0) {
printf("%s\n", PthNam);
perror("Could not open file");
return NULL;
}
printf("file opened for mode %s\n", OpnMod);
return FilPtr;
}