斯特伦有副作用吗

Does strlen have any side effect?

本文关键字:副作用      更新时间:2023-10-16

我知道,或者更确切地说,strlen()是一个相当简单的函数,但由于某种原因,当我想在我的一个函数中使用它时,它会损坏程序。我不知道为什么会发生这种情况,因为strlen的结果是正确的,但如果包含strlen,整个程序就无法工作。具体地说,这部分代码造成了麻烦:

int random1 = strlen(objectNameValue);
int random2 = strlen(PA_type_value);
int random3 = strlen(attributeValue);
printf("length of objectNameValue: %d, PA_type_value: %d, attributeValue: %d", random1, random2, random3);

我的程序实际上是一个简单的LDAP服务器,我试图发送一些数据——例如,当我把这部分代码放在注释中时,这些变量(attributeValue),它可以完美地工作。但如果我把它放在那里,发送的数据是不正确的,我真的不知道strlen会如何影响它们。有趣的是,strlen实际上打印的是正确的结果。

为了进一步指定,strlen中的这三个变量都是char[]类型,并且末尾都有/0。有人能帮忙吗?

因此,在评论中提出请求后,下面是一个更详细的了解:基本上,以非常微小的方式,这就是我正在做的事情:

char message_out[1024];
bzero(message_out, 1024);
char objectNameValue[1024];
strcpy(objectNameValue,"cn=");
char PA_type_value[5] = {'u', 'i', 'd'};
strcat(Message_out, objectNameValue);
strcat(Message_out, PA_type_value);

但有时我不会把固定的字符放入字符串中,而是另一个字符串。,我需要知道这个字符串有多大,因为我需要计算message_out的总长度。我总是注意字符串,要足够大,要用零初始化。

输出是这样的:

对象长度NameValue:12,PA_type_value:3,attributeValue:8

问题可能在于strlen如何查找长度。strlen遍历一个字符数组的所有字符,直到找到一个终端\0字符。如果数组没有这个终端字符,那么实现可能会超出您给它的字符数组的内存边界,并导致未定义的行为。