[英]Error while trying to allocate memory using malloc for custom struct
I am attempting to allocate some dynamic memory for a custom stack in my c program. 我试图在我的c程序中为自定义堆栈分配一些动态内存。 However, I receive the error 0xC0000005: Access violation writing location 0x00000014 during the malloc call.
但是,我在malloc调用期间收到错误0xC0000005:访问冲突写入位置0x00000014。
Here is my struct definition and my function calling malloc: 这是我的struct定义和调用malloc的函数:
#include <stdio.h>
#include <stdlib.h>
#define EMPTY -1;
typedef enum boolean_tag { TRUE, FALSE } Boolean;
typedef enum direction_tag { ACROSS, DOWN } AnswerDirection; /*The direction of an answer in the crossword*/
typedef struct answer_tag {
/*A single 'Answer' is a single node making up a linked list*/
int answerNumber;
AnswerDirection direction;
char *answerString; /*The answer's value in chars*/
struct answer_tag *nextAnswer; /*Points to the next answer in the linked list*/
} Answer;
typedef struct space_tag {
/*A single space inside of a board*/
int numberOfCurrentAnswers; /*How many Answers currently cross through the space*/
char value;
int x;
int y;
struct space_tag *behindSpace;
struct space_tag *nextSpace;
} Space;
void InitAnswers(Answer *);
Space *InitCrossword();
Space *InitSpace();
void ProgramClosingCleaning(Space *);
main(){
Space *board;
board = InitCrossword();
ProgramClosingCleaning(board);
}
void InitAnswers(Answer *answerKey){
}
Space *InitCrossword(){
int xLimit, yLimit; /*Limits set*/
int xTraverse, yTraverse; /*Coordinate variables to use in traversing*/
Space *currentSpace = NULL;
Space *nextSpace;
printf("Please enter the size of the board: x y\n");
scanf("%d %d", &xLimit, &yLimit);
for (xTraverse = 0; xTraverse < xLimit; xTraverse++){
for (yTraverse = 0; yTraverse < yLimit; yTraverse++){
nextSpace = InitSpace();
nextSpace->x = xTraverse;
nextSpace->y = yTraverse;
nextSpace->numberOfCurrentAnswers = 0;
nextSpace->value = EMPTY;
nextSpace->behindSpace = currentSpace;
currentSpace->nextSpace = nextSpace;
currentSpace = nextSpace;
}
}
while (currentSpace->behindSpace != NULL)
currentSpace = currentSpace->behindSpace;
return currentSpace;
}
Space *InitSpace(){
return (Space *) malloc(sizeof(Space));
}
void ProgramClosingCleaning(Space *currentSpace){
Space *nextSpace;
while (currentSpace != NULL){
nextSpace = currentSpace->nextSpace;
free(currentSpace);
}
}
Thanks for any help! 谢谢你的帮助!
I see two problems with the posted code (which the compiler should have emitted warnings for): 我看到发布的代码存在两个问题(编译器应该发出警告):
Init()
and InitSpace()
which means they will have a return type of int
Init()
和InitSpace()
隐式声明意味着它们的返回类型为int
Init()
does not return a value. Init()
不返回值。 The problem is this line in InitCrossword()
function: 问题是
InitCrossword()
函数中的这一行:
currentSpace->nextSpace = nextSpace;
on first iteration of the for
loop currentSpace
is NULL. 在
for
循环的第一次迭代中for
currentSpace
为NULL。
I'm pretty sure the syntax you're using creates your struct with type space_tag
and Space
is actually a variable (see http://www.cplusplus.com/doc/tutorial/structures/ ). 我非常确定您使用的语法会创建类型为
space_tag
的结构,而Space
实际上是一个变量(请参阅http://www.cplusplus.com/doc/tutorial/structures/ )。
Try this code: 试试这段代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Space {
int numberOfCurrentAnswers;
char value;
int x;
int y;
struct Space *lastSpace;
struct Space *nextSpace;
};
main(){
struct Space *space;
space = Init();
}
Space *Init(){
struct Space *nextSpace;
nextSpace = InitSpace();
}
Space *InitSpace(){
return (Space *) malloc(sizeof(Space));
}
Edited based on example code posted 根据发布的示例代码进行编辑
您缺少Init();
的返回函数Init();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.