C语言小问题:

今天做算法的时候突然想到一个问题:下面是代码
char str[100];
char *p=(char *)malloc(100*sizeof(char));
printf("%d %d",sizeof(str),sizeof(p));
str是字符数组,p是指向100字节大小的空间,这个程序会输出100 和4
我明白指针的大小是4个字节,但是我想问这两个有什么差别?
关于数组和指针的基本区别我明白,比如数组名是常量地址,不能赋值等;
我想问问两者在效率和空间上的差别。请大家帮帮忙,谢谢了。小弟是初学者,提问肯定有些不清楚,请大家包容下,没明白的给我发个消息,万分感谢

第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是指针变量,变量就有存储空间,而数组名实际就是首地址,没存储空间。
相似回答