大二上学期,曾写过这样的一段代码
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *ptr1 = "hello string"; char *ptr2 = (char*)malloc(strlen(ptr1)-2); strcpy(ptr2,ptr1); while(*ptr2 != '\0') printf("%c",*ptr2++); return 0; } 就是利用malloc函数申请了比str1的少空间,然后将str1拷贝到这个空间里,发现最后可以完整的打印出helllo world来,难道申请的内存不仅仅有strlen(ptr1)-2 吗一位朋友这样说的
“其实这种情况是正常的(当然做法是不可取的)..找点资料可以看下内存的最小block, 也就是说内存有一个最小块, 不管你申请得多小,也会是这么大的.这样是为了加快寻址.
就比如,你malloc出来的地址永远是偶数的不会是奇数(当然,前提是偶地址寻址方式).
只是个人的理解,可以参考字节对齐.”
我感觉很有道理,后来我进行了测试,只申请6个字符大小的空间,然后把一个很长的字符串付给str1 ,使得这个字符串的大小一定超过那个所谓的内存最小块,结果很好,果然出现了异常~
这不仅引发了思考,就是效率问题,忘记那本书上说的了,就是double和float之间最好选择double,应为二者的效率几乎是一样的,但是double的精度却比float好的多。
那我们是不是也可以申请最小一块的内存呢?求朋友们的指点