C语言 - 初级内存

来源:互联网 发布:网络课程艺术鉴赏答案 编辑:程序博客网 时间:2024/05/16 07:45
代码区:存放的都是编译后形成的二进制文件.
常量区:关键词const.放在常量区的常量是只读不可写的.
静态区:关键词static.只被初始化一次,默认值为0,程序运行完就会被释放.
堆区:关键词malloc.是由程序员手动分配和释放的,它的空间比较大.
(内存释放:关键词free,内存都是标记释放的,只是指针不指向这里了,但是内容还在.)
栈区:存储的是局部变量和函数参数.(即卸载花括号里的变量)
栈区的特点:先进后出,即从高到低分配,从低到高使用.
注意!!!!!!!!!通过指针操作,返回栈内存是不安全的.栈区的内存是系统自动分配和释放的,栈区的空间容量是很小的.

内存分配函数:
void *calloc(n,size);
例如:
    int *p = calloc(10, 2);
    for (int i=0; i<20; i++) {
        *(p+i) = 2;
        printf("%d ",*(p+i));
    }


void *realloc(*p,new size);
例如:
int *p = calloc(10, 2);
    for (int i=0; i<20; i++) {
        *(p+i) = 2;
        printf("%d ",*(p+i));
    }
    printf("\n");
    int *p2 = realloc(p, 5);
    for (int i=0; i<5; i++) {
        *(p+i) = 2;
        printf("%d ",*(p2+i));
    }

内存操作函数:
内存赋值:void *memset(void *s , int c , size_t n);
例如:
   char *p1 = malloc(8);
    char *p2 = memset(p1, 97, 8);
    for (int i=0; i<8; i++) {
        printf("%c ",*(p2+i));
    }

内存拷贝:void *memcpy(void *dest,const void*source,size_t n);
例如:
    char *p1 = malloc(8);
    char *p2 = memset(p1, 97, 8);
    for (int i=0; i<8; i++) {
        printf("%c ",*(p2+i));
    }

    char *p3 = malloc(5);
    p3 = memcpy(p3, p2, 5);
    for (int i=0; i<5; i++) {
        printf("%c ",*(p3+i));
    }

内存比较:int memcmp(const void *buf1, const void *buf2, unsigned int count)
例如:
    char *p4 = malloc(8);
    char *p5 = malloc(8);
    memset(p4, 65, 8 );
    memset(p5, 97, 8 );
    int count = memcmp(p4, p5, 8);
    printf("%d",count);
第一个参数是被减指针,第二个参数是减数指针,第三个参数是比较几个字节.跟strcmp类似,也是比较的ASCLL码表的值.

0 0