C - 程序在调用free()后崩溃

时间:2016-08-15 14:24:42

标签: c pointers malloc free

我一直在使用指针,按位操作,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);
}

1 个答案:

答案 0 :(得分:4)

您通过将指针移动到行的超出范围来调用未定义的行为

pConvertedNumber = pConvertedNumber - 1;

尝试将传递给pConvertedNumber的三个convertBase更改为pConvertedNumber + 32,以便指针aritimetic不会超出范围。

另请注意,您应该在托管环境中使用标准int main(void)而不是void main(),这在C89中是非法的,在C99或更高版本中是实现定义的,除非您有一些特殊原因要使用非标准签名。