English 中文(简体)
C. 小型和免费
原标题:about malloc() and free() in C

我有以下编码:

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int a;
}node;

int main()
{
    node * n;

    printf("
%d
",n->a);

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

    printf("
%d
",n->a);
    n->a = 6月;
    printf("
%d
",n->a);
    free(n);
    printf("
%d
",n->a);
    n->a = 4);
    printf("
%d
",n->a);
    return 页: 1;
}

所得产出如下:

1314)172

页: 1

6月

页: 1

4)

My question is even after free(n) , why does n->a = 页: 1 and how can we also reassign it to any value like n->a = 4) ?

难道没有自由使记忆 block被 n倒吗?

最佳回答
free(n);
n->a = 4; // is not guaranteed to work, might crash on some implementations

Invokes Un Defin Behaviour。

为什么N->a = 0,以及我们如何将其重新分配给N->a = 4等任何价值?

这是因为没有定义的Behaviour意味着任何事情都会发生。 你们可以依靠这一点。

P.S.:Don t 写这种编号。

www.un.org/Depts/DGACM/index_russian.htm

https://stackoverflow.com/users/15168/jonathan-leffler” 注意到您的法典援引 早于<代码>(免费)(,然后参考/code>。

node * n; //n is not initialized
printf("
%d
",n->a);  //dereferencing a wild pointer invokes UB.
问题回答

重新使用一个自由点类似于复制你租用的一辆汽车的钥匙,归还汽车,然后试图利用该钥匙在你将汽车送回出租地后进入汽车。 你也许能够放弃,但你却不这样做,而且常常会给你带来麻烦。

无、自由或不得对相关记忆采取任何行动。 驳回申请无效。 其他进程/进程可能已超出记忆,或者如果你重新 un,数据可能与你留下的数据一样。

你们有责任确保你不参考免费记忆。

如果你不给某个点人留下来的记忆,行为就没有界定。 这意味着它可以做任何事情。 它可能会引发错误,或者可能做其他事情。

在多数情况下,如果您的<代码>免费<>代码/代码>有某种记忆,这种记忆不会立即重新使用,而且不会立即被操作系统收回。 这意味着,你的记忆仍然可以调取,而且仍将包含以前的价值。 你经常读写或写不出错误,但你不能依靠这一行为

如果你在很多不同的环境中实施这一守则,你就会发现,在某些环境中,它总是会发生错误,但在其他很多情况下,它会起到“大部分时间”的作用。 这使得C很难想象:

记忆组已被释放。 这意味着你不能给它写信;这意味着你不能给它写信。 该机器不会阻止你这样做(通常有一些工具,如电栅栏,会防止它)。

你们今后会发现,你将最终做这一意外的事情,而且通常会发生Bad(tm)事件。

在大多数针对MMU(如x86)硬件的操作系统上,如果申请地址没有绘制地图,实际发现记忆错误的唯一途径是。 由于MMU没有条目,可以告诉它,在实际记忆中发现与所要求的逻辑处理有关的数据,因而造成中断和操作系统接手。

但是,大多数操作系统在为申请而管理记忆方面并没有多大作用,只是给它留下一个相邻的记忆库。 操作系统允许在MUM中停靠的申请,因为大多数MMU的 are光太高,足以使申请安全地进行,而不会对其他方案产生负面影响(无论是事故还是恶意)。

因此,如果您的“代码”()有些东西,如果您的用药已经在其现有地址空间中提出,那么,如果你后来在<代码>上免费(>上提出,则除非在您的地址空间的末尾出现这种情况,否则你可以将其退回到操作系统上,使这个记忆区在你试图阅读时造成错误。

例如,有一些办法可以做到如下:mmap(<>mmap(>>),但这实际上不是利用这一职能的适当理由。

Most of the OS will allocate a certain minimum space that will be equal to or greater than the space you requested. Once you call free, this space will not go back to the OS, instead kept with you for future reuse. Hence, you can get away with something like what you have written above.

但严格来说,这被归类为“未界定”行为。 但是,你可以放弃这一局面,这是多数时候。 只是不 ha;





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签