c基础(4) 内存模型与操作

1.静态变量 

      1.在程序执行只会被初始化一次 ,但是可以被多次赋值      2.在另外的文件中不能使用 ,static修饰的变量只能在本文件中使用

      3.未初始化的 静态变量与全局变量 初始值为0                                      4.

#include<stdio.h>
#include<Windows.h>

extern int b=10;
void func(){
    static int a=10;
    printf("%d \n",a++);       10 11 12 13 14 15 16 17 18 19 
}
void main(void) {
    for (int i = 0; i < 10; ++i) {
        func();
    }
    return;   }

  3.使用  extern 声明,然后可以使用一个项目中的文件的变量(static除外)或者函数,

2.内存四块模型

 3.malloc  开辟堆内存

void main(void) {
    char *p = malloc(sizeof(char)*10);   创建10个大小的堆内存
 
    strcpy(p,"hello world");
    char *p1 = "hello world";
    char *p2 = "hello world";
    printf("%p \n",p);     0000000002A01400
    printf("%p \n",p1);    0000000000404000
    printf("%p \n",p2);    0000000000404000
        free(p);
    return;
}

  1.p1  和  p2都是字符常量区的字符串,所以地址一样的,   p是  malloc 函数 创建10个char类型大小的堆内存再拷贝的内存不一样

   2. memset(p,0,10);  使用memest重置一块内存的值   参数:  目标 , 重置的值, 重置大小   上面是  1*10个         值最好是0

2.memest

  可以重置栈空间中的数组值, 大小为4 *5=20 

     int arr[] = {1,2,3,4,5};
    memset(arr,0,20);

    for (int i = 0; i < 5; ++i) {
        printf("%d \n",arr[i]);   0 0 0 0 0
    }

3.memcpy, memove

   1.拷贝 一个内存中的值到另一个内存中去, 拷贝5个int类型的大小   ,拷贝重复的内存地址会报错,  而memove不会报错

   2.memcpy拷贝结束标志是看 个数,  而strcpy拷贝结束是以字符串 \0为结尾

  int arr[] = {1,2,3,4,5};
    int *p = malloc(sizeof(int)*5);
    memcpy(p,arr,20);

    for (int i = 0; i < 5; ++i) {
        printf("%d \n",p[i]);   1,2,3,4,5
    }

4.memcmp

   比较两个内存中的值.可以指定个数比较.   相同返回0   不同返回-1

    int arr[] = {1,2,3,4,5};
    int arr2[] = {1,2,3,4,5};
    int a =memcmp(arr,arr2,5);  0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章