今天写代码,遇到一个bug,我自己也调试了比较久
简单来说,就是我想封装一个比较字符串的函数
然后这个函数里面调用memcmp函数去实现
#include<stdio.h>
#include <stdbool.h>
#define CONSTANT_STR "root:x:0:0:root:/root:/bin/bash\n"
bool is_target(const char *src, char * target) {
if (memcmp(target, src, sizeof(src)) == 0) {
return true;
}
return false;
}
int main(){
printf("%d",is_target(CONSTANT_STR,"root:x:0:\naaa"));
}
因为我这里可能会传入不同的常量,就写了个类似的代码,但是我后面发现上面代码居然会返回true
后来我发现好像是长度求错了
sizeof(char) // 通常 1 字节
sizeof(short) // 通常 2 字节
sizeof(int) // 通常 4 字节(在 16 位系统上可能是 2 字节)
sizeof(long) // 通常与操作系统位数相同,32 位系统是 4 字节,64 位系统是 8 字节
sizeof(long long) // 通常 8 字节
sizeof(float) // 通常 4 字节
sizeof(double) // 通常 8 字节
sizeof(long double) // 大小因实现而异,通常 12 或 16 字节
对于指针类型来说
sizeof(char *) // 通常 32 位系统是 4 字节,64 位系统是 8 字节
sizeof(int *) // 同上
sizeof(void *) // 同上
sizeof(double *) // 同上
所以上面代码返回值是true,因为比较的长度是8,刚好前8位一样
那么怎么修改呢
1.使用strlen去做
2.传入len这个参数,在传入的时候写sizeof(CONSTANT_STR)