标准库函数使用及源码

几个常规内存函数经常会使用的怀疑人生,现在整理一下

文章目录

  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

以下对内存函数进行整理。


提示:以下是本篇文章正文内容,下面案例可供参考

一、资源

MSDN网址

MSDN,我告诉你msdn,微软下载中心,msdn我告诉你,msdn下载,微软系统下载,纯净版系统下载icon-default.png?t=N7T8http://www.msdn3.cn/index.html

c库函数手册

C库函数手册icon-default.png?t=N7T8https://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

三、用法

3.1.memset

局部变量

整型数组

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

3.1.1使用分析

对程序进行调试

标准库函数使用及源码_第1张图片

解释: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'占一个字节

3.1.2栈内存分析

这边还涉及到一个栈空间内存申请时地址的问题。

代码如下

#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;
}

看图

标准库函数使用及源码_第2张图片

 图中显示,

变量名 地址
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,只有四个字节?其实是因为是十六字节的。

3.1.3栈上的变量读写前需要初始化吗

看这个题目

#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

截图为证

 标准库函数使用及源码_第3张图片

#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提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(资料查找手册,c语言)