札记-杂记(1):C/C++

札记-杂记(1):C/C++

有很多内容比较零散,没有很值得研究的地方;

有很多东西比较容易混淆,不是很容易区别;

……

本文主要是记录我的日常的小实践,特别小的那种,不定期更新本文~


(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.c

OK,编译成功!

假设现在我将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),而是与函数的原型声明有关。

猜你喜欢

转载自blog.csdn.net/test1280/article/details/72904039
今日推荐