C 中的内存分配错误



我正在尝试在GMP中获取大整数的二进制表示。我将 1 和 0 存储在一个名为 expBinary 的数组中。我使用 malloc 分配大小为 "int" 的内存,然后在添加新位时使用 realloc 来增加此内存。转换运行完美,没有任何问题,但是当我尝试在 while 循环后使用 malloc 分配更多内存时,当我第二次调用相同的代码时,它会给我分段错误,第一次它没有给我分段错误。我已经检查过并且"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));

如果您使用的是 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("%sn", expBinary);打印表示,你应该改用char *,在这种情况下,你应该考虑sizeof(char) == 1始终,你将需要在10的末尾添加一个额外的字节,值为''

相关内容

  • 没有找到相关文章

最新更新