翁恺C笔记|动态内存分配

    xiaoxiao2024-12-23  19

    【题引子】

    C99可以用变量定义数组的大小,其他不可以。

    int number; scanf("%d",&number) //C99中可以这么干 int a[number];所以如果我们在定义之前不知道需要多少空间,应该怎样申请空间呢?

    【动态内存分配】

    动态内存分配:int* a=(int*)malloc(n*sizeof(int))

    malloc函数原型:

    #include <stdlib.h> void* malloc(size_t size)表示程序向系统申请一块大小为size的内存空间,函数返回一个void*,指向系统给其分配内存的首地址。如果返回为NULL,表示没有这么多空间可以分配了,即分配失败。 系统分配的只是连续的size大小的内存 (以字节为单位),并不管你向这个内存里存什么类型数据,所以malloc函数返回void指针。

    如果需要在该内存区间存放int类型数据,强制转换为int*即可。

    例程:

    int main() { int n=0; int i=0; scanf("%d",&n); int* a=(int*)malloc(n*sizeof(int)); for(;i<n;i++) *(a+i)=i; for(i=n-1;i>=0;i--) printf("%d ",*(a+i)); free(a); return 0; } 用malloc申请的内存空间,要记得释放掉。

    int* a=(int*)malloc(n*sizeof(int));对此语句,指针a的地址在栈上,而指针a所指向的地址却在堆上。

    函数返回的时候,其栈会自动被销毁,但堆不会。所以要用free()释放掉。

    free释放的是指针a所指向的内存,不是指针。指针是一个变量,只有程序结束后才会被销毁。

    当free()掉指针a所指向的内存时,指针a相当于指向的是垃圾,对其解引用可能会出错。

    所以free(a)后,记得a=NULL将a置为NULL。

    【你的系统可以为你分配多少内存?】

    int main() { void* p=NULL; int cnt=0; while(p=malloc(100*1024*1024))//当p为NULL时跳出循环 cnt++; printf("分配了%d00MB空间\n",cnt); return 0; }结果:分配了1900MB空间

    (呜呜呜~翁恺那里有3300MB呢,我才有这么点~同32-bit电脑)

    这么些内存,可要好好管理,用完记得free哦~

    【动态内存释放】

    1.free()把申请来的空间还给系统;

    2.申请来的地址都应该还给系统;

    3.只能free申请来的地址空间的首地址;

    4.free(NULL)是合法的;

    5.free过了再去free,程序会崩溃。

    int main() { void* p; int i=5; int* q=&i; p=malloc(100*1024*1024); p++; free(p);//不可以,只能free首地址 free(q);//不可以,i不是malloc来的 return 0; }翁恺老师表示这样free(p)是不可以的,系统会说没有分配p这一块地址。我用的code-blocks没有报错= =

    【注意事项】

    1.malloc时一定要检测是否申请成功(否则后面可能会对0地址进行写操作,使程序崩溃);

    2.用完要释放申请来的空间,否则会造成内存泄漏;

    3.释放后记得把指针指向NULL,防止程序后面不小心对它操作;

    4.只能free申请来的地址空间的首地址;

    5.不能释放多次,除了空指针。

    【来自翁老师的建议】

    1.一个malloc对一个free;

    2.好的程序架构;

    2.经验!纸上得来终觉浅,绝知此事要躬行!

    【讨论】

    相邻两次malloc得到的空间是否是连续的呢?你得到的空间的实际大小是否就是你要求的大小呢?如果你malloc零长度会得到什么结果呢?试试看,然后尝试对结果开展猜测和解释。

    参考:http://blog.csdn.net/r91987/article/details/6337032

    转载请注明原文地址: https://ju.6miu.com/read-1294912.html
    最新回复(0)