C语言中字符数组和字符指针

来源:百度知道 编辑:UC知道 时间:2024/06/05 18:22:57
一个
char c[10]
和一个
char *lc_str = NULL;
lc_str = (char*)malloc(sizeof(char) * 10);
在使用和内存方面有哪些区别呢,开放性问题,能回答到什么层面追加多少分,谢谢大家
谢谢huang1196 ,进一步问一下,如果在MAIN里面
char *p=malloc(1000*sizeof(char)),之后想释放掉部分空间比如200,如何进行?

char c[10] 这里是在编译的时候就为你分配好了安全合法的内存区域。一共10个字节。它在存在于内存的栈。也就是说它的生命周期是随着函数的结束而结束(除非你把它声明成一个全局的)。当它在main()中声明,那么main()完了就释放。如果它存在于子函数,那么子函数完了就被自动释放这十个字节的空间。

第二种是动态分配内存。
也就是说程序在运行的时候才分配内存。同样也是合法安全的区域。也一样是10个字节。这个区域存在于内存的堆部分。堆上的空间系统能是不会自动释放的,要你手动释放,所以一个malloc要对应一个free 不然会造成空间的严重浪费。

补充回答:
原则是你需要用多少就申请多少。如果你想释放一部分空间。那么你需要的是重新分配。用realloc()函数。这个函数会重新分配空间,并把原先的内容拷贝到新开辟的空间上去。
详细请参看:http://baike.baidu.com/view/736230.htm
realloc()函数的说明,里头有我的编辑说明。这里就不多说了。

前者是静态的,也就是每次都要设置一个最大的MAX上限才能保证不会越界。
后者是动态的,你可以用多少就申请多少,可以在任何时候扩大或减小(free),当数据很大时,就需要把不用的空间free,而直接开数组不可以
另外如果在main内,数组不能开很大,但是却可以malloc一个很大的空间。

假如释放最后200个,我只需要将p指向倒数第200的地址,free(p)就可以了。

另外补充一下,如果释放空间,最好通过循环一个一个释放。如果不怕空间浪费,可以只释放头指针。但是这种情况是有隐患的。做一下测试就可以知道,p申请1000位置,char* q=p;哪么如果我free(p),则从头打印所有内容时只有头部被释放掉的部分没有显示,后面与没有释放前p的内容一致。说明没有被释放。
我是这么理解的