0

此代码编译但在运行时崩溃。

typedef struct student{
    char name[ 20 ];
    char last[ 20 ];
    unsigned long int ID;
    char email[ 20 ];
    char BA[ 4 ]; 
} *stu;

stu source[ 20 ];

for( int i=0; i<11 ;i++ )  //copy from file to array
{
    if( fscanf( f1 ,"%s%s%u%s%s", &( source[ i ]->name ), &( source[ i ]->last ), &( source[ i ]->ID ), &( source[ i ]->email ), &( source[ i ]->BA ) ) == EOF );
}

这是它崩溃时显示的代码,它在这一行停止(弹出窗口名称是 input.c)

#ifndef _UNICODE
    *(char *)pointer = (char)ch;  /* stops on this line */
    pointer = (char *)pointer + 1;

我收到的错误消息是“在...中未处理的异常... exe:0xC0000005:访问冲突写入位置0xccccccc”。

有谁知道为什么?

4

2 回答 2

2

您输入:

typedef struct student{...}*stu;

它是一个指向结构的指针,您刚刚声明了一个包含 20 个指针的数组,没有任何返回,您不知道这些指针指向哪里,很可能不是指向有效的内存区域。

以这种方式声明它:

struct student source[ 20 ];

或者使用动态分配,但我想在你的情况下没有必要。

于 2013-07-19T22:15:15.933 回答
0

只需删除 stu 之前的“*”。

解释: 你混合了两件事。你的结构声明

struct student{
   char name[ 20 ];
   char last[ 20 ];
   unsigned long int ID;
   char email[ 20 ];
   char BA[ 4 ]; 
};

如果您只是这样做,您应该声明一个像这样的变量:

struct student var;

和它的重命名:

typedef struct student newName;

在这种情况下,您应该像这样声明一个变量:

newName variable;

所以用你的代码:

typedef struct student{
   char name[ 20 ];
   char last[ 20 ];
   unsigned long int ID;
   char email[ 20 ];
   char BA[ 4 ]; 
} *stu;

您必须像这样在 stu 之前删除“*”:

typedef struct student{
   char name[ 20 ];
   char last[ 20 ];
   unsigned long int ID;
   char email[ 20 ];
   char BA[ 4 ]; 
} stu;

然后像这样声明你的变量:

stu source[20];
于 2013-07-20T00:28:06.447 回答