【问题标题】:MEMCPY segmentation fault when trying to copy into structure element尝试复制到结构元素时出现 MEMCPY 分段错误
【发布时间】:2011-12-27 23:26:38
【问题描述】:

代码是:(我已经用注释标记了错误行

#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)); //这是故障线

当访问不可用的内存或源和目标内存块重叠时,Memcpy 应该会破解,所以就我而言,这些问题似乎都不是有效的。 为什么会裂开?

【问题讨论】:

    标签: c pointers stack memcpy


    【解决方案1】:

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

    试试:

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

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

    struct stack_node_type{
        int nr;
        char *string;
    };
    
    memcpy(&snode->nr, nr, sizeof(nr));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多