前天在做一个大整数相乘的算法,用链表实现,最后一步是字符串逆序,其中用到下面一条语句。
char *c = (char*)malloc(sizeof(char)* 5);
调试的时候想看看strlen(c),结果如下:
sizeof(c)为24,本以为结果是5的,然后郁闷了。
经过一番思考,原来问题出在一个比较隐秘的地方。
由于malloc函数是不会自动给分配的内存初始化的(calloc可以),而且c只是指向分配内存的第一个字符,当求c指向的字符串长度时,是遇到’\0’字符才结束的。
逐语句调试进入strlen函数看看,如下:
里面指出“null-terminated string”也就是要有一个结束标志。于是,我们就可以做个测试了。在后面添上一句,现在代码如下:
char* c=(char*)malloc(5*sizeof(char));
*(c+5)='\0';
然后再看监视器:
现在strlen(c)变成预料中的5了。
多说一句,用char c[5]存字符串的时候也要注意结束标志’\0’, 这样char c[5]就只能存长度为4的字符串了。