双指针 创建内存

双指针

指针的指针,如何利用好指针去创建内存
比如下面的一个例子。通过指针来申请内存。
如果不采用双指针,直接demo*,在传递变量时,会有一个临时变量,叫做_s,
创建内存后,将内存的首地址给了_s.在函数返回时,
second_level_pointer依旧是原来的NULL值,不会有任何的改变

void malloc_method(demo * second_level_pointer) {
    second_level_pointer = (demo*)malloc(sizeof(demo));
}
int main() {
    demo * second_level_pointer=NULL;
    malloc_method(second_level_pointer);
    return 0;
}

再查看下面的两个例子,一个是使用指针的地址,有时候也会直接用指针的引用来做。
理一下思路:
second_level_pointer是一个指针,其地址设置为0xa1,指向一个demo结构体,现在赋值为NULL。
malloc_method(&second_level_pointer)的&second_level_pointer相当于创建一个临时变量:
demo**p=&second_level_pointer.
其中p=0xa1是second_level_pointer地址,*p=NULL;
next_level_pointer = (demo)malloc(sizeof(demo));
比如此时返回的地址是0xa3
*p被赋值为创建demo的首地址,此时*p与second_level_pointer内容是一致的,都是0xa3.
因此成功

#include "stdafx.h"
#include <iostream>
using namespace std;
typedef struct {
    int a;
}demo;
void malloc_method(demo ** next_level_pointer) {
    *next_level_pointer = (demo*)malloc(sizeof(demo));
}
int main() {
    demo * second_level_pointer=NULL;
    malloc_method(&second_level_pointer);
    //demo ** second_level_pointer = NULL;
    //malloc_method(second_level_pointer);
    return 0;
}

如果是直接传递双重指针,在初始化的时候second_level_pointer为NULL,
那么second_level_pointer不指向任何内容,*second_level_pointer是不存在的,没有这个内存空间,无法为其赋值,相当于你没有定义int a;就开始a=0.
而前面的取地址可以用,主要是&second_level_pointer的值为p,*p就是second_level_pointer,这个变量是存在的,只是将其值赋值为NULL

所以在下面这个代码中程序报的异常为:
引发了异常: 写入访问权限冲突。
second_level_pointer 是 nullptr

猜你喜欢

转载自blog.csdn.net/tang_jin2015/article/details/80985158
今日推荐