0 c、C++在malloc的区别
C自由,可以int* p = malloc(sizeof(int) * 5);
C++严谨,只能int* p = (int*)malloc(sizeof(int) * 5);
if (NULL == p),NULL写前面,= =写成 = 一下子能发现
只要是连续的空间都可以使用下标的方式访问内存
int* p = (int*)malloc(sizeof(int) * 5);
p[0]=100;
for循环的前加加与后加加
++i和i++在这里没有区别,因为它们的执行结果都是i = i +1
++i和i++的区别是:在一条语句中(即两个分号之间),++i 被当成(i+1)来计算,i++被当成i来计算。但是语句结束时,i总是增加了1.链接
free(ret);
ret = NULL;//free空指针多次没问题,但free野指针就会宕掉,所以指向NULL
定义变量要初始化,不然容易出bug
int a;a++;a=?;(不一定的)
01 当有两个指针指向堆区
图中的p是指getSpace()中的p,代码中的test1()中的p是为了验证注释中的猜想
#include <stdlib.h>
#include <stdio.h>
int* getSpace()
{
int* p = (int*)malloc(sizeof(int) * 5);
if (NULL == p)
{
return NULL;
}
for (int i = 0; i < 5; ++i)
{
p[i] = i;
}
//看看p[i]有没有带'\0',没有
printf("%p\n", p);
return p;
}
void test1() {
int* ret = getSpace();
//看看ret的地址和下面的p比较,地址有没有给到p,可以给,只要给之前不free,NULL
printf("%p\n", ret);
for (int i = 0; i < 5; ++i)
{
printf("%d\n", ret[i]);
}
//给p地址注释掉,不然给不到
//free(ret);
//ret = NULL;//free空指针多次没问题,但free野指针就会宕掉,所以指向NULL
//看看一块地址能不能被两个指针指向,可以,指向之前别free,NULL
int* p = ret;
printf("%p\n", p);
for (int i = 0; i < 5; ++i)
{
printf("%d\n", p[i]);
}
//free(p);
//p = NULL;
free(ret);
ret = NULL;
//free/NULL指针ret后,指针p的值仍在,但是对空间的数据已经没了,打印乱码
printf("%p\n", p);
for (int i = 0; i < 5; ++i)
{
printf("%d\n", p[i]);
}
//free指针ret后,指针ret=NULL(0000 0000)
printf("%p\n", ret);
}
void main() {
test1();
system("pause");
}
02 传到形参就丢了地址
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//test2
//.cpp严谨,这里的void不能通过,它要求是char*
void allocateSpace(char* p)
{
p = malloc(100);
memset(p, 0, 100);//初始化
strcpy(p, "hello world");
printf("%s", p);
}
void test2()
{
char* p = NULL;
allocateSpace(p);
printf("%s", p);
}
void main() {
test2();
system("pause");
}
03 temp指向堆区,形参p将test3()中的p指向堆区地址
形参p(指向外部p的地址) == temp(指向堆区地址),外部p就拿到堆取地址
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//test3,二级指针,temp中间值
//一级指针只能拿到形参的地址,
void allocateSpace2(char** p)
{
char* temp= malloc(100);
memset(temp, 0, 100);//初始化
strcpy(temp, "hello world");
*p = temp;
}
void test3()
{
char* p = NULL;
allocateSpace2(&p);
printf("%s", p);
}
void main() {
//test1();
//test2();
test3();
system("pause");
}