在两个结构指针之间复制数据,从而产生分段错误

时间:2012-12-16 16:42:36

标签: c struct segmentation-fault malloc

尝试将指向结构的指针的包含复制到另一个指针时,我遇到了分段错误。

我的结构:

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*/
  char *move[2];/*this holds the move that was done to get to this state*/
} State;

内存分配方法:

State *memAllocator() {
  State *p = (State*)malloc(sizeof(State));
  if (p == NULL) {
    printf("Malloc for a new position failed");
    exit(1);
  }
  return p;
}

这是我的Structs Alphabets的一个例子

CANAMA
PANAL_

我有一个随机函数,它给了我两个可能的状态移动。上述状态的两个动作是

CANAM_
PANALA  
AND
CANAMA
PANA_L

在我的随机化状态函数中,我复制了当前状态的包含,然后将其置于新状态。

但问题出在这里,我正在进行广泛的搜索并试图找出从一个州到另一个州的最短距离。在这个过程中,我在搜索中走得很远。但是它在行处给出了一个分段错误,我将当前状态的包含复制到一个新状态。 我也尝试了memcpy,但它给出了相同的分段错误。以下是这些行:

*new_state=*current_state;
/*memcpy(new_state, current_state, sizeof(State));*/

所以,我复制内存的方式是不正确的,导致问题。但如果是这样,那么为什么它会持续一段时间然后发出分段错误。请帮忙。

这是我的完整代码的链接。 Full Code

1 个答案:

答案 0 :(得分:0)

看起来new_state和current_state中至少有一个为null。最好将printfs从printf("If exception below then problem in swapN\n");更改为printf("If exception below then problem in swapN: %p %p\n", current_state, new_state1);以查看发生的位置;但至少有一种可能性如下:

printf("If exception below then problem in swap3\n"); 
new_state1 = swap(empty_index/10, (empty_index%10)-1,current_sta te, new_state1); 
printf("If this prints problem not in swap\n"); 
if (new_state1 != NULL){
    //... [REMOVED FOR CLARITY]
    return; 
} 
/*Go East*/ 
/*printf("Step %d, move %c west\n",current_state->alphabets[empt y_index/10][(empty_index%10)+1]);*/ 
printf("If exception below then problem in swap4\n"); 
new_state1 = swap(empty_index/10, (empty_index%10+1),current_state, new_state1); 

请注意,对swap()的第二次调用将始终将new_state1设为NULL(因为如果不为null,则已经返回了它!)