由strcpy函数引起的C语言动态申请内存的问题
2011-08-04 20:51
363 查看
大二上学期,曾写过这样的一段代码
一位朋友这样说的
“其实这种情况是正常的(当然做法是不可取的)..找点资料可以看下内存的最小block, 也就是说内存有一个最小块, 不管你申请得多小,也会是这么大的.这样是为了加快寻址.
就比如,你malloc出来的地址永远是偶数的不会是奇数(当然,前提是偶地址寻址方式).
只是个人的理解,可以参考字节对齐.”
我感觉很有道理,后来我进行了测试,只申请6个字符大小的空间,然后把一个很长的字符串付给str1 ,使得这个字符串的大小一定超过那个所谓的内存最小块,结果很好,果然出现了异常~
这不仅引发了思考,就是效率问题,忘记那本书上说的了,就是double和float之间最好选择double,应为二者的效率几乎是一样的,但是double的精度却比float好的多。
那我们是不是也可以申请最小一块的内存呢?求朋友们的指点
#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好的多。
那我们是不是也可以申请最小一块的内存呢?求朋友们的指点
相关文章推荐
- 【C/C++开发】C语言 DLL(动态链接库)中申请动态内存释放的问题
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- 拉丁方阵问题。(动态申请内存)
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- 动态链接库中分配内存引起的问题(转)
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- C语言和C++中动态申请内存
- 《IOS_C语言》程序存储区划分、动态申请内存、内存操作函数
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- C语言使用回调函数解决内存申请和释放的问题
- C语言和C++中动态申请内存
- C语言中内存动态分配应注意的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- 关于malloc申请的动态内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- c语言第二周总结-程序存储区划分/动态申请内存/内存操作函数