【发布时间】:2020-09-27 15:06:37
【问题描述】:
就像我说的,memncpy()(在 main 的中间)复制的字符比它应该复制的少 1 个字符,不知道为什么。我添加了 cmets 和图像以使其更易于理解。
#define BIT_AMOUNT 4
char * randomBinaryGenerator(char * random){
int randomNum, i;
char temp;
char * tempPtr = (char *)malloc(1 * sizeof(char));
for(i = 0; i <= BIT_AMOUNT - 1; i++){
randomNum = rand() % 2;
temp = randomNum + '0';
tempPtr = NULL;
tempPtr = &temp;
strcat(random, tempPtr);
}
return random;
}
int main(){
srand(time(0));
char str_bin_bitKey[BIT_AMOUNT] = "";
char * random = (char *)malloc(BIT_AMOUNT * sizeof(char));
char * bin_bitKey = (char *)malloc(BIT_AMOUNT * sizeof(char));
printf("\nSize of str_bin_bitKey: %ld, Size of bin_bitKey: %ld\n", sizeof(str_bin_bitKey), sizeof(bin_bitKey));
bin_bitKey = randomBinaryGenerator(random); //generates 4 bit long binary number
memcpy(str_bin_bitKey, bin_bitKey, BIT_AMOUNT);//copies 1 character less
printf("\nbin_bitKey: %s\n", bin_bitKey); //4 bits
printf("\nstr_bin_bitKey: %s\n", str_bin_bitKey);//3 bits???
long long dec_bitKey = 0;//unimportant for now .... convertBinaryToDecimal(bin_bitKey);
printf("\ndec_bitKey: %lld\n\n", dec_bitKey);
free(random);
return 0;
}
这是输出的样子,你可以看到 str_bin_bitKey 是 3 个字符而不是 4 个:
感谢所有帮助。
【问题讨论】:
-
请注意,
tempPtr = NULL; tempPtr = &temp;正在覆盖malloc返回的指针(到 1 个字节!)。 -
旁白:请使用更惯用的
i < BIT_AMOUNT,而不是i <= BIT_AMOUNT - 1。第一个更难阅读,并且可能有缺陷。 -
在调用
strcat(random, tempPtr);中,两个参数都需要指向以空字符结尾的字符串。但是tempPtr指向一个不包含'\0'的char变量,所以它不是一个以null 结尾的字符串。 -
制作纯文本图像不会让任何事情更容易理解。它只会阻止选择和复制任何内容。
-
同样在调用
strcat(random, tempPtr);random指向由调用者 (main()) 分配给malloc()的内存块,但不是以空值终止的。
标签: c pointers binary size memcpy