C 中的内存分配错误
Memory Allocation Error in C
我正在尝试获取 GMP 中大整数的二进制表示。我将 1 和 0 存储在一个名为 expBinary 的数组中。我使用 malloc 分配大小为 "int" 的内存,然后在添加新位时使用 realloc 来增加此内存。转换是 运行 完全没有任何问题,但是当我尝试在 while 循环之后使用 malloc 分配更多内存时,它给了我 segmentation fault 当我调用相同的代码 第二次,第一次它没有给我任何分段错误。我已经检查过 "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("%s\n", expBinary);
打印表示,您应该使用 char *
代替,在这种情况下,您应该始终考虑 sizeof(char) == 1
,并且您将需要一个1
和 0
末尾的额外字节,值为 '[=22=]'
.
我正在尝试获取 GMP 中大整数的二进制表示。我将 1 和 0 存储在一个名为 expBinary 的数组中。我使用 malloc 分配大小为 "int" 的内存,然后在添加新位时使用 realloc 来增加此内存。转换是 运行 完全没有任何问题,但是当我尝试在 while 循环之后使用 malloc 分配更多内存时,它给了我 segmentation fault 当我调用相同的代码 第二次,第一次它没有给我任何分段错误。我已经检查过 "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("%s\n", expBinary);
打印表示,您应该使用 char *
代替,在这种情况下,您应该始终考虑 sizeof(char) == 1
,并且您将需要一个1
和 0
末尾的额外字节,值为 '[=22=]'
.