由strcpy函数引起的C语言动态申请内存的问题

大二上学期,曾写过这样的一段代码

#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好的多。

那我们是不是也可以申请最小一块的内存呢?求朋友们的指点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值