一个笑话讲明白了C语言的字符数组和动态内存分配

【场景1】char funds[10000];

有一天,我向老板申请一笔工程款,估计费用不超过一万元。我拿了一张纸去找老板,纸上写着:

char funds[10000];

老板看了看纸上的申请,不禁笑了笑,对我说:这就好像你向我申请10000元的工程款啊!同意。

我:谢谢老板审批!凭我久经沙场的经验,这次的项目不会花很多资金,我保证工程结束后退回余款给您的!

老板:可是,说明白一点:如果你的工程超出这个预算,我可不会再给你拨款哦!


(很不幸,人算不如天算,字符串太长,超出funds数组声明的限制,内存溢出,程序异常终止)


我:老板,不好意思,实际项目花费需要一万五,超出了预算,请问怎么办?

老板:你看着办。

我:……

(工程泡汤了)

【场景2】char* funds = malloc(sizeof(char) * 10000);

过一段时间我又接了一项工程,保守估计至少需要花费一万元。
有了上一次刻骨铭心的经历,这次要格外小心,不能再犯错。
于是我决定使用动态分配内存来解决这个问题。
我找到财务部门,递交了一份申请表格,上面写着

char* funds = malloc(sizeof(char) * 10000);

财务部门的人看着这份申请表格,有些疑惑地问我:“这就好像你要向我们申请10000元的工程款啊!但是,如果你需要更多的资金,你需要再次申请才行呢!”

我想了想,觉得这样还是不够灵活。决定再向财务部门提交一份补充申请,申请额外的资金。于是在申请表格上写下了这样的内容:

funds = realloc(funds, 5000);

财务部门的人接到这份申请,看了看金额,有点困惑地问:“这好像是再次向我们申请拨款5000元,你不会把工程款都花光了吧?”

我赶紧解释道:“不,不,这只是为了确保工程能够顺利进行下去!如果我们需要更多的资金,我们只需再次申请,然后及时向财务部门汇报实际花费。”

财务部门的人恍然大悟,笑着说:“原来如此,你们程序员真是会玩花样!”

于是,我开始着手开展工程,并不断向财务部门汇报实际的开销。

有了足够的资金,工程得以顺利进行。工程结束后,我向财务部退回剩余的工程款,在结算单上写清楚:

free(funds);

【场景3】char* funds = calloc(10000, sizeof(char));

过了一些日子我又接了一个项目,再次使用动态分配内存的方式向财务部申请拨款。
我去财务部递交了一份申请表格,上面写着:

char* funds = calloc(10000, sizeof(char));

财务部:怎么这次跟上次写得不一样了?

我:这个项目比较特殊,要求使用全新的百元大钞,您这边有吗?

财务部:没有。如果不介意旧纸币,我可以立刻拨款给你,你急着要吗?

我:越快越好。

财务部:那你等我一下,我现在就去银行柜台提取全新的纸币。

我:好的,麻烦您了!

(malloc与calloc的区别在于:
malloc立即分配内存,但内容随机,不一定是0字节。
calloc先分配内存,然后多做一步:在指定大小的内存空间里清零。)


希望这个笑话可以让大家对C语言的字符数组和动态内存分配有个更生动的理解。
 

你可能感兴趣的:(c语言,开发语言)