zoukankan      html  css  js  c++  java
  • C语言数据结构小点

    数据结构中的status变量 

    1.这里的Status是一个结构或变量类型。STATUS是返回的状态,程序中的error,ok就是和它对应的!

     2.typedef int Status; /*类型名定义用status代替int*/ 这样你应该理解了吧,status push(linkstack top,elemtype e) 的意思就是:int push(linkstack top,elemtype e),Status只是int的替身。
    原文链接:https://blog.csdn.net/sugesi/article/details/53823479

    exit与return区别

    1. exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统;而return 是退出当前函数,返回函数值,把控制权交给调用函数。
    2. exit是系统调用级别,它表示一个进程的结束;而return 是语言级别的,它表示调用堆栈的返回。
    3. 在main函数结束时,会隐式地调用exit函数,所以一般程序执行到main()结尾时,则结束主进程。exit将删除进程使用的内存空间,同时把错误信息返回给父进程。

    原文链接:https://blog.csdn.net/firefly_2002/article/details/7960595

    malloc函数

    malloc函数可以从上获得指定字节的内存空间,其函数声明如下:

    void * malloc(int n);

    如果函数执行成功,malloc返回获得内存空间的首地址;如果函数执行失败,那么返回值为NULL。

    申请内存方法的理解与总结:

    若要为函数形参内容malloc内存,则形参指针需要为二级指针**P

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 #include <string.h>
     4 char* test()
     5 {
     6     char *p;
     7     p = (char*)malloc(10 * sizeof(char));
     8     strcpy(p, "123456789" );
     9     return p;
    10 }
    11 void main()
    12 {
    13     char *str = NULL ;
    14     str = test();
    15     printf("%s
    ", str);
    16     free(str);
    17 }

    若要为在函数体中定义的某指针malloc内存,则使用一级指针*p

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 #include <string.h>
     4 void test(char **p)
     5 {
     6     *p = (char*)malloc(10 * sizeof(char));
     7     strcpy(*p, "123456789" );   
     8 }
     9 void main()
    10 {
    11     char *str = NULL ;
    12     test(&str);
    13     printf("%s
    ", str);
    14     free(str);
    15 }

    malloc函数分配得到的内存空间是未初始化的。因此,一般在使用该内存空间时,要调用另一个函数memset来将其初始化为全0

    注意事项

    A、申请了内存空间后,必须检查是否分配成功。

    B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

    原文链接:https://blog.csdn.net/HuffieWang/article/details/51744043?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158927807219724843309479%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158927807219724843309479&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-51744043.nonecase&utm_term=malloc%E5%87%BD%E6%95%B0

    memset函数:

    函数原型是:void *memset(void *s, int ch, size_t n);

    函数功能是:将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零操作的一种最快方法。
     头文件是:<memory.h>或<string.h>
    memset函数通常用来对一块已经分配地址的内存进行初始化,并且通常初始化为0或者字符''(实际上是一样的)

    realloc函数

    realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能,其函数声明如下:

    原型:void * realloc(void * p,int n);

    所需头文件:#include<stdlib.h>或#include <malloc.h>

    指针名=数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!

    其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上p之前指向的空间被释放relloc函数分配的空间也是未初始化的。

     

    用法:

    1. realloc失败的时候,返回NULL
    2. realloc失败的时候,原来的内存不改变,不会释放也不会移动
    3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址
    4. 如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针**a,对a调用realloc时只会释放一维,使用时谨防内存泄露
    5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的,或者是NULL
    6.传递给realloc的指针可以为空,等同于malloc

     

     

     

     

    free()到底释放了什么

    free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了

  • 相关阅读:
    洛谷-P5743 【深基7.习8】猴子吃桃
    洛谷-P5741 【深基7.例10】旗鼓相当的对手
    洛谷-P5740 【深基7.例9】最厉害的学生
    洛谷-P5739 【深基7.例7】计算阶乘
    jvm中常见的指令笔记
    join()方法的源码分析
    Java中线程状态的各种转换关系
    java构造器遇到父类没有无参构造的分析
    jvm栈和堆
    spring新注解
  • 原文地址:https://www.cnblogs.com/YOLO-in-the-sun/p/12771912.html
Copyright © 2011-2022 走看看