首页 文章

C中的内存分配错误

提问于
浏览
0

我试图在GMP中获得一个大整数的二进制表示 . 我将1 's and 0'存储在一个名为 expBinary 的数组中 . 我使用malloc来分配大小为"int"的内存,然后在添加新位时使用 realloc 来增加此内存 . 转换运行完美没有任何问题,但是当我尝试在while循环后使用malloc分配更多的内存时,它给我 segmentation fault 当我调用相同的代码 second time 时,它第一次给我没有分段错误 . 我已经检查过"expBinary"没有存储任何超出范围的内容,我已经给出了下面的代码

int binarySize = 0;                                                        
int * expBinary = malloc(sizeof(int));                                 
int i = 0;                                                                  

// Run until exp == 0                                                       
while(mpz_cmp_ui(exp,0) != 0)                                               
{                                                                           
    binarySize++;                                                           
    expBinary = (int*) realloc(expBinary,(binarySize));                     
    // Getting LSB of exp                                                   
    if(mpz_even_p(exp) != 0)                                                
        expBinary[i] = 0;                                                   
    else                                                                    
        expBinary[i] = 1;                                                                                                                                 
    // Incrmenting variables                                                
    i++;                                                                    
    // Dividing exponent by 2                                               
    mpz_tdiv_q_ui(exp,exp,2);                                               
}                                                                           

// This line is giving error
int * temp = malloc(sizeof(int));

1 回答

  • 4

    如果您使用 int 数组,那么这是错误的

    expBinary = (int*) realloc(expBinary,(binarySize));
    

    它应该是

    expBinary = realloc(expBinary, binarySize * sizeof(*expBinary));
    

    或等效地,

    expBinary = realloc(expBinary, binarySize * sizeof(int));
    

    出于显而易见的原因,我更喜欢 sizeof(*expBinary) ,而且,如果 realloc() 失败,你会松开对前一指针的引用,所以我推荐这个

    void *tmp;
    tmp = realloc(expBinary, binarySize * sizeof(int));
    if (tmp == NULL)
        handleFailureHereAndDontContinueToTheNextLineAndFree_expBinary_Please();
    expBinary = tmp;
    

    现在,如果你想使用任何 printf("%s\n", expBinary); 打印表示,你应该使用 char * ,在这种情况下你应该始终考虑 sizeof(char) == 1 ,并且你需要在 10 的末尾添加一个额外的字节值 '\0' .

相关问题