有很多内容比较零散,没有很值得研究的地方;
有很多东西比较容易混淆,不是很容易区别;
……
本文主要是记录我的日常的小实践,特别小的那种,不定期更新本文~
(1)Subject:sizeof一个指针:
#include <stdlib.h> #include <stdio.h> #include <memory.h> int main() { int *p = malloc(sizeof(int) * 10); printf("%d\n", sizeof(p)); printf("%d\n", sizeof(int) * 10); return 0; }输出:
8 40结论:
对一个指针进行sizeof,获得的是指针本身的大小,即使这个指针是指向一个malloc出来的空间; 注意,当对一个数组进行sizeof时,返回的是数组空间大小,但是在函数参数传递时,数组标识符将会退化为普通指针,特别注意下~
(2)编译时要有对头文件所在目录的可执行权限:
[test1280@localhost 20170623]$ tree . |-- include | `-- mymath.h `-- main.c #include <stdio.h> #include <stdlib.h> #include "mymath.h" int main() { return 0; } [test1280@localhost 20170623]$ gcc -o main main.c -I./include [test1280@localhost 20170623]$ ll 总计 16 drwxrwxr-x 2 test1280 test1280 4096 06-23 21:16 include -rwxrwxr-x 1 test1280 test1280 6556 06-23 21:18 main -rw-rw-r-- 1 test1280 test1280 86 06-23 21:09 main.cOK,编译成功!
假设现在我将include目录取消对其可执行权限==》
[test1280@localhost 20170623]$ chmod a-x include [test1280@localhost 20170623]$ ll -d include drw-rw-r-- 2 test1280 test1280 4096 06-23 21:16 include再来编译:
[test1280@localhost 20170623]$ gcc -o main main.c -I./include main.c:1:19: 错误:./include/stdio.h:权限不够 main.c:2:20: 错误:./include/stdlib.h:权限不够 main.c:3:20: 错误:./include/mymath.h:权限不够可以看到没有权限。
故:编译文件时(make也罢,实际还是调用gcc/g++等编译器)要有对头文件所在目录的可执行权限!
(3)关于函数返回值副本的问题
先看下下面的代码:
string foo() { string s = "hello, world!"; return s; } int main() { string str = foo(); return 0; }你说这一段程序中涉及几个对象?
我认为是3个!
首先你调用了foo函数,创建了一个s对象;
s对象返回,由于foo原型声明的是非引用返回类型,所以这里实际上在主调foo处生成了一个临时变量;
将这个临时变量赋值给str;
共计三个对象。
需要注意的是,在string str = foo()处,由foo函数实际返回了一个新的对象,这个对象和s对象并不是同一个!
再看一段代码:
int i; int foo() { i = 1; return i; } int main() { i = foo(); return 0; }即使i是全局变量,但是在i = foo()处,由foo函数返回时,还是做了个副本!
最核心最关键的一句话是:
你函数声明的就是值传递而不是址传递,本身函数返回的时候就是要有个临时变量来接受他,怎么可能没有临时对象呢?
这一点并不因为你在被调用函数中,返回的是一个局部变量(str)还是全局变量(i)而改变,完全是无关的。
临时对象创建与否,不是与被返回值的生命周期有关(即使你是局部、全局、甚至static),而是与函数的原型声明有关。