我有一个名为State:的结构
typedef struct State{
char alphabets[2][6];
struct State *PREV; /*this points to the previous state it came from*/
struct State *NEXT; /*this points to the next state in the linked list*/
int cost; /*Number of moves done to get to this position*/
int zero_index;/*this holds the index to the empty postion*/
} State;
这是我的memAllocator()方法:
memAllocator(){
struct State *p = (State*) malloc(sizeof(State));
if (p==NULL){
printf("Malloc for a new position failed");
exit(1);
}
return p;
}这是我的主要方法。
main(){
State *start_state_pointer=memAllocator();
State start_state;
start_state.zero_index=15;
start_state.PREV = NULL;
start_state.alphabets[0][0]='C';
start_state.alphabets[0][1]='A';
start_state.alphabets[0][2]='N';
start_state.alphabets[0][3]='A';
start_state.alphabets[0][4]='M';
start_state.alphabets[0][5]='A';
start_state.alphabets[1][0]='P';
start_state.alphabets[1][1]='A';
start_state.alphabets[1][2]='N';
start_state.alphabets[1][3]='A';
start_state.alphabets[1][4]='L';
start_state.alphabets[1][5]='_';
start_state_pointer=&(start_state);
/*start_state=*start_state_pointer;*/
}
我认为语句start_state_pointer=&(start_state);只是将指针start_state_pointer分配给在state start_state期间创建的少量临时空间,而不是分配给我分配的空间。但是,当我尝试注释掉的语句start_state=*start_state_pointer来尊重指针并为开始状态分配空间时。它给我一个分段错误。
我刚开始在C工作。有人能帮我吗?
memAllocator
和main
函数没有显式返回类型。这种风格的代码已经被弃用超过10年了。C中的函数应该始终具有返回类型。对于main
,返回类型应为int
,对于memAllocator
函数,返回类型应该为State *
。
第二个问题是为State
结构分配空间,但随后填充不同的State
结构,并使用start_state_pointer = &(start_state);
覆盖指向先前分配的State
结构的指针。
要使用刚刚分配的内存,您需要使用以下内容:
State *start_state = memAllocator();
start_state->zero_index = 15;
start_state->PREV = NULL;
start_state->alphabets[0][0] = 'C';
// etc.
不需要创建两个State
结构。当您在原始代码中使用State start_start;
时,您正在创建一个名为自动存储的结构。这意味着这个结构的空间是自动分配的,并在它声明的作用域结束时自动为您解除分配。如果您获取这个结构的地址并将其传递给程序的其他部分,那么您将传递一个指向解除分配的结构的指针,这可能是程序崩溃的原因。