makefile
http://web.mit.edu/gnu/doc/html/make_2.html
http://web.mit.edu/gnu/doc/html/make_toc.html#SEC117
变量及作用域
http://www.jianshu.com/p/74f2a0d6595b
C语言特性说明
http://www.infoq.com/cn/articles/c-language-2016
函数参数按值传递
有个函数,它应该接受并初始化一个指针 void f(int *ip) { static int dummy = 5; ip = &dummy;} 但是当我如下调用时: int *ip; f(ip); 调用者的指针却没有任何变化。
你确定函数初始化的是你希望它初始化的东西吗?请记住在 C 中, 参数是 通过值传递的。被调函数仅仅修改了传入的指针副本。你需要传入指针的 地址 (函数变成接受指针的指针), 或者让函数返回指针。
函数返回指针
那么返回字符串或其它集合的争取方法是什么呢?
返回指针必须是静态分配的缓冲区 (如问题 7.6 的答案所述), 或者调用者传入的缓冲区, 或者用 malloc() 获得的内存, 但不能是局部 (自动) 数组。
返回指针必须是静态分配的缓冲区 (如问题 7.6 的答案所述), 或者调用者传入的缓冲区, 或者用 malloc() 获得的内存, 但不能是局部 (自动) 数组。
free释放内存
指针中是没有所在内存块大小的信息的,那么 free 怎么才能知道要释放的内存块有多大呢?
于是,对于大多数内存分配器,malloc 申请的实际内存比你要求的空间要大几个字节,里面存储了额外的数据来记录这块内存有多大,一般就是直接存在指针左边。free 的时候,就会去读取指针地址减去一个常数之后的那块内存,来获取内存块的信息。
因此如果你 free 一个不指向内存块开始处的指针,free 的时候就会把其他的数据错误解释成内存块的信息,(大概率)导致程序崩溃。
当然现代的内存分配器对于不同大小的内存申请,会采用不同的分配策略,但无论策略如何,去 free 一个不是 malloc 来的指针,都是非常危险的举动。
于是,对于大多数内存分配器,malloc 申请的实际内存比你要求的空间要大几个字节,里面存储了额外的数据来记录这块内存有多大,一般就是直接存在指针左边。free 的时候,就会去读取指针地址减去一个常数之后的那块内存,来获取内存块的信息。
因此如果你 free 一个不指向内存块开始处的指针,free 的时候就会把其他的数据错误解释成内存块的信息,(大概率)导致程序崩溃。
当然现代的内存分配器对于不同大小的内存申请,会采用不同的分配策略,但无论策略如何,去 free 一个不是 malloc 来的指针,都是非常危险的举动。
当我 malloc() 为一个函数的局部指针分配内存时, 我还需要用 free() 明确的释放吗?
是的。记住指针和它所指向的东西是完全不同的。 局部变量在函数返回时就 会释放, 但是在指针变量这个问题上, 这表示指针被释放, 而
不是
它所指向的对象。 用 malloc() 分配的内存直到你明确释放它之前都会保留 在那里。 一般地, 对于每一个 malloc() 都必须有个对应的 free() 调用。
版权声明:本文为u012333307原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。