抛出异常:读取访问冲突。无法从头文件中打印信息

时间:2017-11-15 19:28:43

标签: c visual-studio-2017

我正在尝试从位于Objects.h头文件中的pID指针打印出信息。无论我尝试做什么,我都会抛出" Exception:读取访问冲突。 p是0xCEDECEDF。" Visual Studio 2017中的错误。换句话说,它无法读取内存。 这是main.cpp文件的代码部分。错误来自For循环,我试图打印出信息。我调试了代码没有成功。

#include "stdio.h"
#include "DateTime.h"
#include "Objects.h"
#include "Headers.h"
#include "Structs.h"
#include "malloc.h"
#pragma warning ( disable : 4996 )  //Disables some errors that might occure

void PrintObjects(Object9 **ppStruct1);
//int InsertNewObject(HeaderA **ppStruct1, char *pNewID, int NewCode);
//Object9* RemoveExistingObject(HeaderA **pStruct1, char *pExistingID);

int main()
{
    Object9 **pStruct1 = (Object9 **)GetStruct1(9, 35);

    Object9 **p = pStruct1;
    int i;
    for (i = 0; i < 35; i++)
    {
        printf("%p\n", *(p + i));
        printf("%s\n", (*(p + i))->pID); //This is the line where the error 
        //occures
    }

    if (pStruct1 == NULL)
        printf("pStrcut on NULL\n");
    else
        printf("Ok\n");
    PrintObjects(pStruct1);

    return 0;
}

这是Objects.h文件中的部分。

typedef struct ob9
{  // formatting string for printf is "%s %lu %02d %s %04d\n", the result is 
      for example "Abcde 100 01 Detsember 2010"
   // or "Abcde Fghij 100 01 Detsember 2010"
    char *pID;
    unsigned long int Code;
    Date3 *pDate3; // Declaration of Date3 is in file DateTime.h
    struct ob9 *pNext;
} Object9;

GetStruct1函数来自Structure.h头文件。我不知道这是否有助于确定问题,但以防万一我还要添加整个Structs.h文件代码。 我需要使用:&#34; void ** GetStruct1(int ObjectType,int nObjects);&#34;功能

//
//            Structures: function prototypes
//            -------------------------------

void **GetStruct1(int ObjectType, int nObjects);
HeaderA *GetStruct2(int ObjectType, int nObjects);
HeaderB *GetStruct3(int ObjectType, int nObjects);
HeaderC *GetStruct4(int ObjectType, int nObjects);
HeaderA **GetStruct5(int ObjectType, int nObjects);
HeaderA *GetStruct6(int ObjectType, int nObjects);
HeaderD *GetStruct7(int ObjectType, int nObjects);

/* ObjectType - 1, 2,...10 - type of objects to be inserted into the data 
 structure.
   nTypes -number of objects to be inserted into the data structure.
   ObjectType and nObjects are specified by the instructor.
   Return value - pointer to the first byte of data structure.

   Examples for structure from 25 objects of type 4:
   Object4 **pStruct1 = (Object4 **)GetStruct1(4, 25);
   HeaderA *pStruct2 = GetStruct2(4, 25);
   HeaderB *pStruct3 = GetStruct3(4, 25);
   HeaderC *pStruct4 = GetStruct4(4, 25);
   HeaderA **pStruct5 = GetStruct5(4, 25);
*/

我可以打印出地址,但不能打印出我需要的信息。我知道我做错了什么但不确切知道是什么。任何帮助将不胜感激。

编辑:稍微更改了代码。

1 个答案:

答案 0 :(得分:0)

问题在于,您使用来自GetStruct1的新指针覆盖malloc()返回的指针,这指向未初始化的数据,而不是结构数组。摆脱界限:

pStruct1 = (Object9 **)malloc(sizeof(Object9 **));

您也不需要这一行:

p = (Object9 *)malloc(sizeof(Object9));

因为您立即使用以下内容覆盖p

p = *pStruct1;

您还使用p错误。 pStruct1是指向指针数组的指针。如上所述设置p时,它将设置为数组中的第一个指针。添加到p并不能获得数组中的下一个指针,它指向p指向的对象之外。您需要将p设置为pStruct,添加到此,然后间接通过它来获取数组中的指针。

Object9 **p = pStruct1;
for (int i = 0; i < 35; i++) }
    printf("%p\n", *(p + i));
    printf("%s\n", (*(p + i))->pID);
}