尝试复制到结构元素时MEMCPY分段错误

时间:2011-12-27 23:26:38

标签: c pointers stack 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-&gt; nr,nr,sizeof(int)); //这是错误的行

当正在接收不可用内存或源和目标内存块重叠时,Memcpy应该破解,因此就我而言,这些问题似乎都没有效果。 它为什么破解?

1 个答案:

答案 0 :(得分: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));