几个常规内存函数经常会使用的怀疑人生,现在整理一下
以下对内存函数进行整理。
提示:以下是本篇文章正文内容,下面案例可供参考
MSDN网址
MSDN,我告诉你msdn,微软下载中心,msdn我告诉你,msdn下载,微软系统下载,纯净版系统下载http://www.msdn3.cn/index.html
c库函数手册
C库函数手册https://math.ecnu.edu.cn/~jypan/Teaching/ParaComp/docs/C_functions.html
2.1 安全函数
1、没搜到安全函数库源码
2、vs安全函数集没找到。
2.1常用库函数
1 | memset | |
2 | memcpy | |
3 | strcpy | |
4 | strcat | |
5 | strtok | |
6 |
局部变量
整型数组 | int array[5] = {0}; //全部清零 |
memset(array, 0, sizeof(char) * 5) | |
字符数组 | char array[5] = {'\0'}; //全部清零 |
memset(array, '\0', sizeof(char) * 5) | 存疑 清零了,其他位编程了NUL |
全局变量:
整型数组 | int array[5] = {}; 或者int array[5]; //全部清零 |
字符数组 | char array[5] = {}; 或者char array[5]; //全部清零 |
纠正上面的一个错误,char array[20] = {'0'};并不能将数组全部初始化,字符数组要使用memset才行。
#include
#include
#include
#include
using namespace std;
int main()
{
char array[10] = {'0'};
array[9] = '\0';
printf("array:");
printf("%s",array);
printf("\n");
printf("array[1]:%c",array[1]);
printf("\n");
char arrayStr[10] = {'0'};
memset(arrayStr, '0', 10 * sizeof(char)); //头文件#include
arrayStr[9] = '\0';
printf("arrayS:");
printf("%s",arrayStr);
printf("\n");
int arrayInt[10] = {0};
printf("arrayInt:");
for(int i = 0; i < 10; i++)
{
printf("%d",arrayInt[i]);
}
return 0;
}
//array:0
//array[1]:
//arrayS:000000000
//arrayInt:0000000000
对程序进行调试
解释:array数组的其他位ascii值是0,是代表NUL,即为ascii码值为0。'\0'的ascii值是30。
现在得到的结论,是栈上的字符型数组内存不进行memset或 ={'\0'}操作,是有脏数据的。
栈上的整形数组直接 = {0}即可全部清零。
现在的问题就是 字符型数组使用={'\0'}算是清零了吗。其他位好像是变成了NUL。
但是如果想像考试中那样将字符型数组全部变成0000000,则需要使用menset的操作。
这边还涉及到了一个点就是当时程序中
char array[10] = "0123456789"; //报错
char array[10] = "012345678"; //正常,'\0'占一个字节
这边还涉及到一个栈空间内存申请时地址的问题。
代码如下
#include
#include
#include
#include
using namespace std;
int main()
{
char test = '\0';
char arrayTest[10];
char array[10] = {'0'};
array[9] = '\0';
printf("array:");
printf("%s",array);
printf("\n");
printf("array[1]:%c",array[1]);
printf("\n");
char arrayStr[10] = {'0'};
memset(arrayStr, '0', 10 * sizeof(char)); //头文件#include
arrayStr[9] = '\0';
printf("arrayS:");
printf("%s",arrayStr);
printf("\n");
int arrayInt[10] = {0};
printf("arrayInt:");
for(int i = 0; i < 10; i++)
{
printf("%d",arrayInt[i]);
}
return 0;
}
看图
图中显示,
变量名 | 地址 | |
test | 0x61ff1b | |
arrayTest | 0x61ff11 | |
array | 0x61ff07 |
test是最先定义的,地址值最大,arrayTest次之,array地址值最小 ,由此可见,栈上申请地址是向下生长的。画表格如下
test | 0x61ff1b | \0 | |
0x61ff1a | 39 | ||
0x61ff19 | 38 | ||
0x61ff18 | 37 | ||
0x61ff17 | 36 | ||
0x61ff16 | 35 | ||
0x61ff15 | 34 | ||
0x61ff14 | 33 | ||
0x61ff13 | 32 | ||
0x61ff12 | 31 | ||
arrayTest | 0x61ff11 | 30 | |
0x61ff10 | 39 | ||
0x61ff0F | 38 | ||
0x61ff0E | 37 | ||
0x61ff0D | 36 | ||
0x61ff0C | 35 | ||
0x61ff0B | 34 | ||
0x61ff0A | 33 | ||
0x61ff09 | 32 | ||
0x61ff08 | 31 | ||
array | 0x61ff07 | 30 |
而且,首地址地址值是数组中最小的。数组的地址是从左往右地址值逐渐增大。
另外我一直没搞懂的是,为什么array地址是0x61ff07,但arrayTest的地址是0x61ff11,只有四个字节?其实是因为是十六字节的。
看这个题目
#include
int main()
{
union
{
int k;
char i[2];
}*s,a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("a.k:%x\n", a.k);
return 0;
}
//a.k:293839
截图为证
#include
int main()
{
union
{
int k;
char i[2];
}*s,a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("a.k:%x\n", a.k);
int t;
printf("t:%d\n",t);
t = 12;
printf("t:%d\n",t);
return 0;
}
//a.k:3839
//t:3821568
//t:12
结论就是,读之前需要初始化。写之前最好初始化。
该处使用的url网络请求的数据。
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。