【问题标题】:Make copy of a struct variable in C在 C 中复制结构变量
【发布时间】:2021-06-11 08:49:41
【问题描述】:

我想将堆的记录元素保存在 struct _Record 变量中,然后删除该记录,删除记录后我想返回保存的记录。我怎样才能做到这一点?

struct _Record
{
    int id;
    char name[15];
    char surname[15];
    char email[26];
    int grade;
};

//struct _Record saved = hp->elem[0].record;在这里我尝试分配给另一个名为 saved 的变量。

struct _Record deleteNode(minHeap *hp) {
    struct _Record saved;
    if(hp->size) {
        saved = hp->elem[0].record;

        hp->elem[0] = hp->elem[--(hp->size)] ;
        hp->elem = realloc(hp->elem, hp->size * sizeof(node)) ;
        heapify(hp, 0) ;
        printf("%d %s %s %s %d",saved.id,saved.name,saved.surname,saved.grade);
        return saved;
        
    } else {
        printf("\nMin Heap is empty!\n") ;
        free(hp->elem);
        return saved; 
    }
}

最小可重现示例:

int main(){

    minHeap heap = initMinHeap();
    struct _Record rec;
   
    rec.id=1;
    strcpy(rec.name,"tName");
    strcpy(rec.surname,"tSurname");
    strcpy(rec.email,"email");
    rec.grade=10;

    node node;
    node.record = rec;
    insertNode(&heap,node);

    struct _Record saved;
    saved = deleteNode(&heap);
    printf("%s","\n");
    printf("%d %s %s %s %d",saved.id,saved.name,saved.surname,saved.email,saved.grade);
    return -1; 
}

注意:其他堆函数工作正常。在deleteNode中返回保存的节点有问题。

我得到的结果:没有

我想要得到的结果:“1 tName tSurname email 10”

【问题讨论】:

  • 什么是“堆”?您分配项目的数据类型是堆还是堆内存? minHeap 是什么? struct _Record saved = hp->elem[0].record; 后跟 return 不正是在做你想做的事吗?请说明您获得了什么结果以及您想要获得什么结果。
  • 函数写错了顺便说一句,它必须总是返回一个项目。你应该做类似struct record saved = NULL; if(hp->size) saved = ...; else { ... } return saved;的事情。
  • 与问题无关,我们不允许使用前导下划线后跟大写字母来命名变量。这是为库实现保留的。
  • @Lundin 是的,这是我想要的,但它不起作用。当我尝试打印保存的记录时,没有打印任何内容。
  • 你能发一个minimal reproducible example来显示这种行为吗?

标签: c struct


【解决方案1】:

我意识到我在 printf() 函数上犯了一个错误。

printf("%d %s %s %s %d",saved.id,saved.name,saved.surname,saved.grade);

我给 printf 函数提供了 4 个参数,但它必须是 5。

printf("%d %s %s %s %d \n",rec.id,rec.name,rec.surname,rec.email,rec.grade);

另外,@rkrahl 的回答也是正确的。

【讨论】:

  • 如果您使用 gcc 编译,它通常会检查格式字符串并计算参数,因此您会收到警告。
  • 我用 gcc 编译了它,但我不知道为什么它没有给我警告。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2015-09-11
  • 2013-03-30
  • 2016-05-09
  • 2013-08-20
  • 2013-09-16
  • 2011-11-24
相关资源
最近更新 更多