我一直在使用指针,按位操作,malloc等进行锻炼和实验,同时遵循教程并遇到崩溃,我不知道如何修复(不删除free())。
教程代码与我的相同,具有完全相同的free()函数,并且对它们起作用。
这是代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *convertBase(unsigned int InNumber, int base, char *pConvertedNumber){
char hexVal[]="0123456789ABCDEF";
if(base<2 || base>16){
printf("Enter a base between 2 and 16");
exit(1);
}
*pConvertedNumber = '\0';
do{
int value = InNumber % base;
pConvertedNumber = pConvertedNumber - 1;
*pConvertedNumber = hexVal[value];
InNumber/=base;
}while(InNumber !=0);
return pConvertedNumber;
}
void main(){
unsigned int six = 6;
unsigned int seven = 7;
char *pConvertedNumber;
pConvertedNumber = malloc(33 * sizeof(char));
unsigned int AND = six & seven;
printf("%s & ", convertBase(six, 2, pConvertedNumber));
printf("%s = ", convertBase(seven, 2, pConvertedNumber));
printf("%s \n\n", convertBase(AND, 2, pConvertedNumber));
free(pConvertedNumber);
}
答案 0 :(得分:4)
您通过将指针移动到行的超出范围来调用未定义的行为
pConvertedNumber = pConvertedNumber - 1;
尝试将传递给pConvertedNumber
的三个convertBase
更改为pConvertedNumber + 32
,以便指针aritimetic不会超出范围。
另请注意,您应该在托管环境中使用标准int main(void)
而不是void main()
,这在C89中是非法的,在C99或更高版本中是实现定义的,除非您有一些特殊原因要使用非标准签名。