【问题标题】:linked list initialization in C programming languageC语言中的链表初始化
【发布时间】:2023-04-03 04:09:01
【问题描述】:

我正在处理 C 编程语言链接列表,并且我有下面的 MCQ:

我们有以下喜欢的列表:

typedef struct _elt *PElement;
typedef struct _elt {
void *data;
PElement next;
} Element;
PElement creer_elt_entier(int data) {
     PElement pelt=(PElement)malloc(sizeof(Element));
/* Initialize  data field*/ ;
pelt->next=NULL;

return pelt;
}

检查正确的答案,将 /* Initialize Field */ 替换为适当的指令:

☐ pelt->data=data;

☐ pelt->data=&data;

☐ pelt->data=*data;

☐ pelt->data=malloc(sizeof(int));

*(pelt->data) = data;

☐ pelt->data=malloc(sizeof(int));

pelt->data = data;

我无限制地回答了第四个选择,这是正确的答案,但我仍然不知道为什么它是正确的。

【问题讨论】:

  • 这是唯一会通过类型系统而不分配在函数返回时变得无效的值的答案(这是答案 2 所做的)。尽管如此,它仍然缺乏错误检查(malloc 可能会失败)并鼓励可怕的内存分配策略。在节点中存储指向malloced 的指针而不是直接存储int 很可能是不必要的浪费。此外,命名结构 _elt 完全是 UB。

标签: c pointers linked-list


【解决方案1】:
  1. 第一个选项 pelt->data = data; 不正确,因为您不能将整数分配给 void 指针。
  2. 第二个选项pelt->data = &data; 不正确,因为如果您将指针分配给参数data,当函数返回时pelt->data 将是垃圾,因为指向的变量将不存在。
  3. 第三个选项pelt->data = *data; 不正确,因为您不能取消引用非指针变量。
  4. 第四个选项pelt->data = malloc(sizeof(int));*(pelt->data) = data;是正确的;指向整数类型的堆变量的指针可以分配给 void 指针,并通过首先取消引用来初始化堆变量。
  5. 第五个选项pelt->data=malloc(sizeof(int));pelt->data = data; 不正确,因为您不能将整数分配给整数指针。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2010-12-14
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多