2011-12-27 36 views
1

的代码是:(我已经打上了故障线路与评论试图复制到结构元素时MEMCPY分段错误

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h> 

typedef struct stack_node_type{ 
    int *nr; 
    char *string; 
struct stack_node_type *next; 
} SNODE; 

SNODE * pushStack(SNODE **stack, int *nr, char *string){ 
SNODE *snode=NULL; 
if(nr!=NULL){ 
    snode = (SNODE *) malloc(sizeof(SNODE)); 
    aux=snode->nr; 
    printf("%d\n", *nr); 
    memcpy(snode->nr, nr, sizeof(int)); //THIS IS THE FAULTY LINE 
    if(*(&stack)!=NULL){ 
     snode->next=&(**stack); 
    } 
    else{ 
     snode->next=NULL; 
    } 
    if(string!=NULL){ 
     snode->string=&(*string); 
    } 
} 
else{ 
    if(string!=NULL){ 
     snode = (SNODE *) malloc(sizeof(SNODE)); 
     if(*(&stack)!=NULL){ 
      snode->next=&(**stack); 
     } 
     else{ 
      snode->next=NULL; 
     } 
     snode->string=&(*string); 
    } 
} 
if(snode!=NULL){ 
    return &(*snode); 
} 
else{ 
    return &(**stack); 
} 
} 

SNODE * popStack(SNODE **stack, SNODE *pop){ 
SNODE *snode=NULL; 
snode=&(**stack); 
if(snode!=NULL){ 
    if(snode->nr!=NULL){ 
     pop->nr=(int *) malloc(sizeof(int)); 
     * (pop->nr) = * (snode->nr); 
    } 
    if(snode->string!=NULL){ 
     int strdim = strlen(snode->string); 
     pop->string=(char *) malloc(strdim*sizeof(char)); 
     strcpy(pop->string, snode->string); 
    } 
    SNODE *to_del=snode; 
    snode=snode->next; 
    free(to_del); 
} 
return &(*snode); 
} 

int main() 
{ 
SNODE *stack=NULL; 
SNODE pop; 
int nr; 
nr=123; 
stack=pushStack(&stack, &nr, "banane"); 
nr=819; 
stack=pushStack(&stack, &nr, "portocale"); 
while(stack!=NULL){ 
    stack=popStack(&stack, &pop); 
    printf("POP: %d, \"%s\"\n", *(pop.nr), pop.string); 
} 
    return 0; 
} 

重述故障线路

memcpy(snode-> nr,nr,sizeof(int)); //这是故障线路

时不可用的存储器被accesed或源和目的地存储器块重叠的memcpy应开裂,所以只要我而言,没有这些问题似乎是有效的。 它为什么破解?

回答

4

您为结构分配了内存,但没有为成员本身分配内存。

尝试:

snode = (SNODE *) malloc(sizeof(SNODE)); 
snode->nr = malloc(sizeof(int)); 

但是,如果我是你,我会改变结构:

struct stack_node_type{ 
    int nr; 
    char *string; 
}; 

memcpy(&snode->nr, nr, sizeof(nr)); 
+0

外观极好答案 – 2011-12-27 23:41:50