C/C++ strlen参数不能为null的思考和sizeof的比对

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/diangangqin/article/details/101113776

最近C项目中遇到一个异常,查看code后发现是strlen的参数是null引起的,在调用strlen之前判断参数是否是null解决了问题。现在在具体分析一下strlen。C/C++中的strlen是比较常用的函数,用来计算字符串的长度,计算出的长度不包含结束符’\0’。下面是关于这个函数的介绍。

strlen() function in c
The strlen() function calculates the length of a given string.The strlen() function is defined in string.h header file. It doesn’t count null character ‘\0’.

Syntax:
size_t strlen(const char *str);

Parameter:
str: It represents the string variable whose length we have to find.
Return: This function returns the length of string passed.

上面的介绍很清楚了,我就不多讲了,只是感觉奇怪的是为什么参数不可以是null,如果是null可以返回0或者一个负数吗,最好是返回一个负数(-1),这样的话就能确定现在参数是null。如果返回0,会和str是’\0’而混淆。现在引起NE异常必然是strlen的实现没有判断参数是null,而对参数直接进行了操作引起的,动不动引起异常,大家知道在C里面的这种异常,后果很严重,设备可能就直接挂掉了,需要重启才能恢复。使用strlen的函数的时候一定要小心,要么能够确定str不是null,如果不能确定一定在调用strlen之前判断参数是否是null,尤其是参数是通过其他函数获取的或者参数已经经过了很长的调用流程才走到了strlen一定要判断参数是否是null。我比较推荐的是下面的使用方法。

int len = (str == null ? -1 : strlen(str));

另外关于sizeof在这里也简单提一下,sizeof不是函数,而是一个运算符,返回的是一个size_t的结果,是编译时的一元运算符(sizeof的计算发生在编译时刻,不是运行时刻),可以用来计算操作数的大小,可以计算变量,也可以计算结构体等类型,和机器相关,不同的机器返回的结果有很大差别。sizeof的作用在字符串和strlen的区别看一下这个例子。

char str[100] = "hello";
int len = strlen(str);//这个返回的值是5;
int size = (int)sizeof(str);这个返回的是100

另外需要额外提醒的是,如果需要分配一块memory来存储字符串(malloc或者strncpy),而长度需要通过使用strlen来计算,那分配的memory的大小是srlen(str) + 1,记得一定要为’\0’留一个位置。下面是三个比较常用的例子。
1

char* output = (char *)malloc(strlen(str) + 1);
if (output != null) {
    memeset(output, 0, strlen(str) + 1);
    memcpy(output. str, strlen(str) + 1);
} else {
    // error handling
}

2

char strout[100] = {0}; // 100 > strlen(str) + 1
strncpy(output, str, strlen(str) + 1);

3

char strout[100] = {0}; // 100 > strlen(str) + 1
strncpy(output, str, strlen(str));
output[strlen(str) + 1] = '\0';

在此总结一下使用strlen使用时候需要注意的地方:
1 参数要判断是否是null
2 strlen计算的长度不包含结束符’\0’,分配空间或者copy的时候需要考虑结束符,或者copy后在destination str的末尾强制设置为’\0’。

猜你喜欢

转载自blog.csdn.net/diangangqin/article/details/101113776