使用malloc为结构分配内存

时间:2012-12-16 00:50:06

标签: c pointers struct malloc

我有一个名为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分配给在状态start_state期间创建的少量临时空间,而不是分配给我分配的空间。 但是,当我尝试注释掉语句start_state = * start_state_pointer来依赖指针并分配空间来启动状态。它给了我一个分段错误。

我刚开始用C.可以有人帮我这个吗?

1 个答案:

答案 0 :(得分:0)

您的memAllocatormain函数没有明确的返回类型。这种代码风格已被弃用超过10年。 C中的函数应始终具有返回类型。对于main,返回类型应为int,对于memAllocator函数,返回类型应为State *

第二个问题是您为State结构分配空间,但随后填充不同的 State结构并覆盖指向先前分配的{{1} } struct using State

要使用刚分配的内存,您需要使用以下内容:

start_state_pointer = &(start_state);

无需创建两个State *start_state = memAllocator(); start_state->zero_index = 15; start_state->PREV = NULL; start_state->alphabets[0][0] = 'C'; // etc. 结构。在原始代码中使用State时,您正在创建一个名为自动存储的结构。这意味着此结构的空间会自动分配,并在声明范围的末尾自动释放。如果您获取此结构的地址并将其传递给程序的其他部分,那么您将通过围绕指向解除分配的结构的指针,这可能就是你的程序崩溃的原因。