gpt4 book ai didi

c - 了解古代 C 中的动态分配

转载 作者:行者123 更新时间:2023-11-30 20:52:43 25 4
gpt4 key购买 nike

如果您不太熟悉动态内存分配,您可以将其视为一种脑筋急转弯。

首先将此代码作为 C 程序保存在 bin 目录中。

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

struct node {
int data;
struct node *next;
} *head=NULL;

void ins_at_beg()
{
struct node *node=malloc(4);
node->next=head; head=node;
printf("Please enter the value to be inserted at the start: ");
scanf("%d",node); // POINT A
}

void ins_at_end()
{
struct node *node=head;
while(node->next) node=node->next;
node->next=malloc(4);
printf("Please enter the value to be inserted at the end: ");
scanf("%d",node->next->data); // POINT B
}

void main()
{
clrscr();
ins_at_end();
printf("%d",head->data);
getch();
}

执行这段代码,一切看起来都很好。

现在程序执行后ins_at_end()主函数为ins_at_beg()并执行该程序,一切看起来仍然很好。

现在手动撤消上述更改(将 ins_at_beg 更改为 ins_at_end )并执行程序。现在您将获得 head->data 的值为 0。

现在只需更改 node 'A 点' 至 node->data您将看到输入的值反射(reflect)在屏幕上(注意:我们没有在主函数中调用该函数)

现在再次反转上述更改并获取 0 作为 head->data 的默认值.

这里要注意的主要事情是,输出会被刚刚定义且未在主函数中调用的函数更改。

只要玩一会儿,你就会知道我想说什么。

问题:为什么当我更改 node 时程序可以正常工作?至node->data即使我实际上没有调用我在主函数中进行更改的函数?

最佳答案

这个:

scanf("%d",node);

还有这个:

scanf("%d",node->next->data);

不正确。 %d 格式说明符需要 int * 作为参数。但相反,您在一种情况下传入 struct node * ,在另一种情况下传入 int 。使用错误的格式说明符来 scanf 调用 undefined behavior这就是为什么你会看到奇怪的结果。

你应该这样做:

scanf("%d",&node->data);

还有这个:

scanf("%d",&node->next->data);

此外,这还对指针的大小做出了假设:

struct node *node=malloc(4);

你应该这样做:

struct node *node=malloc(sizeof(*node));

您也遇到了问题:

void ins_at_end()
{
struct node *node=head;
while(node->next) node=node->next; // <--- here
node->next=malloc(4);
printf("Please enter the value to be inserted at the end: ");
scanf("%d",node->next->data); // POINT B
}

在程序启动时,head 为 NULL,因此您尝试取消引用 NULL 指针,这又会导致未定义的行为。在执行其他操作之前检查这种情况。另外,您应该将列表末尾的 next 指针显式设置为 NULL。

void ins_at_end()
{
struct node *node=malloc(sizeof(*node));
struct node *tmp;

printf("Please enter the value to be inserted at the end: ");
scanf("%d",&node->data);
node->next = NULL;

if (!head) {
head = node;
} else {
tmp = head;
while (tmp->next) tmp = tmp->next;
tmp->next = node;
}
}

关于c - 了解古代 C 中的动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58189340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com