【C/C++】关于char *, char[], const char *等等

编程环境为Xcode

char *a = “hello” //warning:Conversion from string literal to char* is deprecated

前面加上const就没警告了,因为这样声明的字符串不能更改,不管通过指针还是下标形式(注:实际上通过for循环加下标能修改,比如i从0到3,a[i] = 'c'这样打印出来是ccc,而不是ccclo。跟下面类比看。)

const char *a = "hello" //This is OK

如果想修改内容,可以如下

char p[10];
for (i = 0; i < 7; i++)
    p[i] = 'a'
//will print a*7

char m[] = "11111111"
for(i = 0; i < 3; i++)
    m[i] = 'a';
//will print a*3+11111

前者p相当于指向数组头的常量指针,p++会出现错误,这个指针不能移动!(char *有警告,不过能p++)

括号里的数字10其实没有实际意义,如果是p[4],一样能放得下7个a,因为循环赋值过程就是地址增加然后赋值,这样打印p这个指针指向的内容就会把后面的都打印出来(这里有疑问,为什么不是限定大小然后只打印4个a?

后者类似,同样不能p++。如果循环赋值20个a,就会打印出20个a,比原本的8个1要长。


对于上面char *,如果想要修改其内容,可以先定义指针,然后分配内存,这样就类似于数组形式了。如下:

char *p;
p = (char *)malloc(5);
for(i = 0; i < 20; i++)
    p[i] = 'a';
//will print a*20

还是上面的问题,分配了5个字节,还是能打出来20个字节的内容?那malloc意义何在?只是确定有5字节大小的空间?只是检查能不能分配指定大小的空间?

关于malloc原理,引用

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
Linux Libc6采用的机制是在free的时候试图整合相邻的碎片,使其合并成为一个较大的free空间。

应该不是啊,分配给用户指定大小后,剩余的内存会返回链表记录以便分给其他请求,应该不会允许占用后面的内存。

难道是编译器问题?

The malloc function allocates a memory block of at least size bytes. The block may be larger than size bytes because of space 

required for alignment and maintenance information.

对上面的char *p,计算strlen是20,如果设置p[3] = '\0'则strlen是5。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值