bit之2024年5月2日笔记
内存变量使用之栈区细节说明
首先在2022年编译器中,X86环境下看这段代码
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
返回的结果是:
这里要特别强调下,在X86环境下,内存地址在开辟内存空间的时候往往遵循一个规则:根据变量的创建顺序,使用栈区的地址往往是先使用高地址,在使用低地址,这里我们结合代码进入调试模式看看
从这个代码片段来看,&I的值和&arr[12]地址一样,最后在for循环过程中执行到i=12的时候,arr[12]=0,因为地址一样,所以i也会变成0,所以就变成了死循环了
注意,如果在release版本,则会先使用低地址,在使用高地址
const修饰指针变量的位置解释和assert的使用
const好比一把锁,锁住了就不能改变了,这里我们用一级指针来举例子在这里插入代码片
#include<assert.h>
void Change(int* a, int* b)
{
assert(a);
assert(b);
int* z = NULL;
z = a;
a = b;
b = z;
}
int main()
{
int a = 1;
int b = 2;
printf("请输入2个数字\n");
//用指针交换变量
Change(&a, &b);
return 0;
}
这里如果 a和b是NULL空指针,程序是不会提示了,但是如果给了断言assert,则会检测a和b是不是NULL指针,如果是NULL指针就弹出错误提示.
//-----------------------------------------------------------------------------------------------------------------------------
比如intp 如果const 在的左边,比如const int 或者int const ※则表示锁住的是※p也就是说你不能修改p指向的值的修改,如果const在※的右边,则锁住的是p的值,而p是一个内存地址,意味着你不能修改p的值,但是你可以修改p的值.
size_t的解释和妙用
sizi_t代表的是size0f()符号类型的返回,代表无符号类型,比如-1>sizeof(int)这里因为出现了比较运算符,会进行算数转换,有符号数转化为无符号数,所以-1会变成了unsigned int 会变成一个很大的数字.