第1个回答 2011-04-02
这个首先你要去了解一下什么叫栈分配,什么叫堆分配
char str[100];这个是栈分配,程序一旦编译,操作系统便给它分配了空间,且一旦分配了,其大小不可变。
char *p=(char *)malloc(100*sizeof(char));是采用动态分配的,它采用的是堆分配,只有执行到这行语句时,它才分配内存空间,另外,用这种方式去分配的,可以用free去把它释放掉~~~
第2个回答 2011-04-02
当数组是静态的时候, 数组大小是存在数组名上的, 所以sizeof(str) = 100, 即返回数组的长度
但是当数组是动态的时候, 数组大小是存在动态空间上的, 所以sizeof(p)仅仅会返回指针的大小. 我们无法从p里面获取有关数组长度的信息.
静态数组和动态数组在使用上基本无效率的差别的. 除了分配和释放动态数组会产生额外的工作
第3个回答 2011-04-02
char str[100]; 这种是分配在栈里,使用时,内存的生命周期是跟你的定义的位置有关,也不需要程序员去释放,生命周期结束则内存会被自动释放。总的大小一般有1M到2M。
用malloc分配的内存是在堆里,这内存不会自动释放,需要程序员在对应的地方用free去释放。
这两者视情况用,各有各的用处。本回答被提问者采纳
第4个回答 2011-04-02
p是指针,被你存放在了栈里,大小是4,指向了你分配的堆大小是100*1。
sizeof(p)是求p所占的空间大小而不是p所指的空间大小
第5个回答 2011-04-02
我想原因是p是指针变量,变量就有存储空间,而数组名实际就是首地址,没存储空间。