获取错误传递指向文件的指针

时间:2016-01-13 15:20:15

标签: c windows visual-studio-2015

我还在学习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模式编译。请告诉我任何有用的其他信息。

1 个答案:

答案 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;
}