目录
debuge和release的区别
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
我们先来看一串代码,很明显,这是一段有错误的代码,但运行以后的结果是什么?
是不是思考无果,那不妨来运行一下
这么多hehe,一定是死循环了,相信到这里,有很多像我一样的小伙伴之前没有注意过这两个东西,那么这两个有什么区别呢。
我们看到,同样的一段代码,两个不同的版本运行结果完全不同。
在debug为什么会行程死循环而在release却没有
1.局部变量在栈区创建
2.栈区先用高地址再用低地址
debug下,i 在高地址,在往下3个地址正好就是数组 arr[9] 的地址,i 从0 到 12 ,arr[12] 的地方就是i 的地方,被改成 0 ,就成了死循环。
release 里进行了优化,i 成了低地址,就不会发生上面的问题
大小端
什么是大小端
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
为什么有大小端
怎么判断
int check_sys()
{
int i = 1;
return (*(char*)&i); // 取第一个字节的数
//大端:0x 00 00 00 01 00
//小端:0x01 00 00 00 01
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
数据存储练习
//输出什么?
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);//a=-1
//b=-1
//c=255
return 0;
}
//输出什么
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
//输出什么
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
//输出什么
#include <stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
//输出什么
int main()
{
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
return 0;
}
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
#include <stdio.h>
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}
因为 i 是无符号类型,一直大于 0 ,所以会死循环