用了free(*T)还要用一个NULL呢?这两个的作用有啥不一样?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用了free(*T)还要用一个NULL呢?这两个的作用有啥不一样?相关的知识,希望对你有一定的参考价值。

free(*T)还是将内存释放了,NULL在sring.h里#define NULL 0,这里的free跟NULL的作用分别是什么?

两者意思大不一样,你搞混了!free(T);是释放T指针指向的地址开头的一片空间,到底有多大必须是由malloc函数事先分配的已知数;但释放T指向的空间不是释放T指针,T一旦声明,在C中就释放不了了,它永远存在。为了防止后面误用T带来危险,常让它等于0(就是NULL);等于NULL的指针叫空指针,是使用不成的,这就避免了误用带来的危险。以后要用T时要重新赋值…… 参考技术A free是释放内存,将T赋值为NULL是防止非法操作 参考技术B free之前必须有malloc或calloc动态分配过内存,必须成对使用,就是说分配了就要free释放
比如你一次分配了一段10字节的内存空间,在程序结束前,要free一次,
依次,分配过几次,就要free几次,
free的作用和malloc或calloc相反,malloc是向系统申请了内存,free就是把这些内存还给系统
要注意,free(T)的时候,T必须指向分配后最初的地址
如果没有申请,声明T是没有初始化,T就会随机指向一个地址,如果释放会出错,也就是要注意在程序中添加检查代码,使用T=NULL,就可以这样free:
if(T) free(T);
也可以这样分配:
if(T) T=malloc(...);本回答被提问者和网友采纳

UVA10118Free Candies

一开始看数据范围不大想直接暴力搜索,仔细考虑搜索的状态会有很多重复,搜索量仍然很大。

这就是传说中的记忆化搜索。。。number数组表示每一列取了多少个数,ans每一列取得相应数字个数时的最优解。

第九章前面的代码用了引用,在记忆化搜索里面很方便。这个题还要注意搜索的时候要回溯,搜不下去了要尝试另一种。

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <bits/stdc++.h>
 4 #include <cstdio>
 5 
 6 using namespace std;
 7 
 8 typedef long long ll;
 9 const int maxn = 40 + 10;
10 int G[maxn][4];
11 int ans[maxn][maxn][maxn][maxn];
12 bool book[maxn*maxn];
13 int number[4];
14 int n;
15 
16 int dfs(int cnt,int a,int b,int c,int d)
17 {
18     number[0] = a, number[1] = b, number[2] = c, number[3] = d;
19     int & num = ans[a][b][c][d];
20     if(num != 0 || cnt >= 5)return num;
21     int sum = 0;
22     for(int i = 0 ; i < 4 ; i ++)
23     {
24         if(number[i] >= n)continue;
25         int v = G[number[i]][i];
26         number[i]++;
27         if(!book[v])
28         {
29             book[v] = true;
30             sum = max(sum,dfs(cnt-1,number[0],number[1],number[2],number[3])+1);
31             book[v] =false;
32             number[i] --;
33         }
34         else
35         {
36             book[v] = false;
37             sum = max(sum,dfs(cnt+1,number[0],number[1],number[2],number[3]));
38             book[v] = true;
39             number[i]--;
40         }
41     }
42     num += sum;
43     return num;
44 }
45 int main(int argc, char const *argv[])
46 {
47     while (cin >> n && n)
48     {
49         memset(ans, 0, sizeof(ans));
50         memset(book,true,sizeof(book));
51         for (int i = 0 ; i < n ; i++)
52             for (int j = 0 ; j < 4 ; j++)
53                 cin >> G[i][j];
54         cout << dfs(0,0,0,0,0) << endl;
55     }
56     return 0;
57 }

 

以上是关于用了free(*T)还要用一个NULL呢?这两个的作用有啥不一样?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中,malloc和free是啥意思?

UVA10118Free Candies

为啥free函数不在释放内存后,将指针置NULL,野指针有啥用

求助 一个指针被free之后啥时候是NULL?还是不可能是NULL?

C# 读取Sql Server中的NULL返回什么?

C# 读取Sql Server中的NULL返回什么?