c - 我该如何解决这个分配问题(核心转储)?
问题描述
我写了一个程序,它接收两个多项式并计算它们的和乘法。
程序以这种形式得到一个多项式
"2 4 -5 1 0 6 6 4 -8 0 7 3"
并将其翻译成多项式形式:“8x^4+7x^3-5x-8”
我认为我对多项式求和函数有疑问,因为它确实显示了乘法结果。
这是我得到的错误:
*** Error in `./vpl_execution': realloc(): invalid next size: 0x000000000070c210
***
/home/p18206/.vpl_launcher.sh: line 9: 25054 Aborted (core dumpe
d) ./vpl_execution
我得到另一个错误:
ome/p13634/.vpl_launcher.sh: line 9: 25304 Segmentation fault (core dumpe
d) ./vpl_execution
我真的尝试了 evreything,我知道这是一个分配问题,但我就是不明白为什么。
所以在下面的代码中,请检查函数“print polySum”。也可能是函数“sum same power poly”或“print polynom”有问题
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct monom {
int coefficient;
int power;
}Monom;
//defining bool data type
typedef int bool;
#define TRUE 1
#define FALSE 0
#define MEMORY_ERROR_EXIT -1
void polyMerge(Monom* arr1, unsigned int size1, Monom* arr2, unsigned int size2, Monom* res);
void polySort(Monom* polynom, unsigned int size);
void removeElement(Monom* polynomArr, unsigned int size);
Monom* sumSamePowerPoly(Monom* polynomArr, unsigned int* size);
Monom* getPolynom(unsigned int* size);
void printPolynom(Monom* polynom, unsigned int size);
void printPolySum(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2);
void printPolyMul(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2);
void checkMemoryAllocation(void *ptr);
void main()
{
Monom *polynom1, *polynom2; // The input polynoms
unsigned int polynom1Size, polynom2Size; // The size of each polynom
printf("Please enter the first polynom:\n");
polynom1 = getPolynom(&polynom1Size); // get polynom 1
printf("Please enter the second polynom:\n");
polynom2 = getPolynom(&polynom2Size); // get polynom 2
printf("The multiplication of the polynoms is:\n"); // print the multiplication
printPolyMul(polynom1, polynom1Size, polynom2, polynom2Size);
printf("\n");
printf("The sum of the polynoms is:\n"); // print the sum
printPolySum(polynom1, polynom1Size, polynom2, polynom2Size);
printf("\n");
free(polynom1); // releasing all memory allocations
free(polynom2);
}
Monom* getPolynom(unsigned int* size) {
/*This function recieve data from user*/
unsigned int phySize = 1, logSize = 0;
int currCofficient, currPower;
bool lContinue = TRUE; // a flag that keeps that signal if we should keep recieving input
Monom* polyArr;
polyArr = (Monom*)malloc(sizeof(Monom)*phySize);
checkMemoryAllocation(polyArr);
while (lContinue) { //while the user didn't press enter we keep on recieving input
scanf("%d%d", &currCofficient, &currPower);
if (currCofficient != 0) { //if the current cofficient is 0 we do nothing. Else we insert the input to the array
//if the logic size equal to the physical size we double the phySize and reallocate array with the new size
if (logSize == phySize) {
phySize *= 2;
polyArr = (Monom*)realloc(polyArr, sizeof(Monom)*phySize);
checkMemoryAllocation(polyArr);;
}
polyArr[logSize].coefficient = currCofficient; //we locate the input on the current position (logical size)
polyArr[logSize].power = currPower;
logSize++; //we increment logical size of the array
}
if (getchar() == '\n') // the user pressed enter - the flag is "turned off", and we stop receiving input
lContinue = FALSE;
}
*size = logSize; //size recieve the value "log size" which is the actual size of the array
polySort(polyArr, *size); //we sort the array based on power sizes
polyArr = sumSamePowerPoly(polyArr, size); //we unite Monoms that has the same power
return polyArr;
}
void polyMerge(Monom* arr1, unsigned int size1, Monom* arr2, unsigned int size2, Monom* res) {
/*This function merges two Monom arrays into one monom array sorted by powers from the biggest power to the smallest one*/
unsigned int i = 0, j = 0, k = 0;
while (i < size1 && j < size2) {
if (arr1[i].power > arr2[j].power)
res[k++] = arr1[i++];
else
res[k++] = arr2[j++];
}
while (i < size1) //While i<size1 keep copying values from array 1 to result array
res[k++] = arr1[i++];
while (j < size2) //While j<size2 keep copying values from array 2 to result array
res[k++] = arr2[j++];
}
void polySort(Monom* polynom, unsigned int size) {
/*This function sort a Monom array from the biggest power to the smalles one*/
Monom* temp;
unsigned int i;
if (size == 1)
return;
else {
polySort(polynom, size / 2);
polySort(polynom + size / 2, size - size / 2);
temp = (Monom*)malloc(sizeof(Monom)*size); //We temporary allocate an array that will keep the result of the merge
checkMemoryAllocation(temp);
polyMerge(polynom, size / 2, polynom + size / 2, size - size / 2, temp);
for (i = 0; i < size; i++) //We copy the temporary array into our data array
polynom[i] = temp[i];
free(temp); //We delete the allocated memory for the temporary array
}
}
Monom* sumSamePowerPoly(Monom* polynomArr, unsigned int* size) {
/*This function sum polynoms from the same degree to one polynom*/
unsigned int i;
for (i = 0; i < *size - 1; i++) { //We check for each Monom in the array if there are other monoms with the same power
while (polynomArr[i].power == polynomArr[i + 1].power) { //while power of a monom is eqaul to the power of other monoms
polynomArr[i].coefficient += polynomArr[i + 1].coefficient; //we add the next monom to the first one
removeElement(polynomArr + i + 1, *size - i); //and remove the monom we just united into another cell
*size -= 1;
}
}
polynomArr = (Monom*)realloc(polynomArr, sizeof(Monom)*(*size));
return polynomArr;
}
void removeElement(Monom* polynomArr, unsigned int size) {
/*This function removes an element from array*/
unsigned int i;
for (i = 0; i < size; i++) { //We copy each cell into the prior one
polynomArr[i] = polynomArr[i + 1];
}
}
void printPolynom(Monom* polynom, unsigned int size) {
/*This function prints polynom*/
unsigned int i;
for (i = 0; i < size; i++) {
if (polynom[i].power > 1) //if the power is bigger than one that print this form: coffx^power
printf("%dx^%d", polynom[i].coefficient, polynom[i].power);
else if (polynom[i].power == 1) //else if the power is one than print this form: coffx
printf("%dx", polynom[i].coefficient);
else //else print this form: coff
printf("%d", polynom[i].coefficient);
if (i < size - 1 && polynom[i + 1].coefficient > 0) //if there is another element after the current element and its
//cofficient is larger than 0 - print "+"
printf("+");
}
}
void printPolySum(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2) {
/*This function print the sum of two polynoms*/
unsigned int i, j;
unsigned int size;
size = size1 + size2; //We set the size of sum result to be size of both of the polynoms
Monom* sumRes; //We create a sum result array
sumRes = (Monom*)malloc(sizeof(Monom)*size);
checkMemoryAllocation(sumRes);
//We copy each element from both of the polynoms array into the result array
for (i = 0; i < size1; i++)
sumRes[i] = polynom1[i];
for (i = size1, j = 0; i < size && j < size2; j++, i++) {
sumRes[i] = polynom2[j];
}
polySort(sumRes, size); //We sort all of the elements by power size
//We unite all of the cells who has the same power. This action actually sums both of the polynoms to one poly sum.
sumRes = sumSamePowerPoly(sumRes, &size);
printPolynom(sumRes, size); //We print sum reault
free(sumRes); //We free the sum result array after printing it
}
void printPolyMul(Monom* polynom1, unsigned int size1, Monom* polynom2, unsigned int size2) {
/*This function prints the multiplication of two polynoms*/
unsigned int i, j, k, size;
i = 0;
Monom* mulRes;
size = size1 * size2; //We set the size of sum result to be the multiplication of both of the polynoms size
mulRes = (Monom*)malloc(sizeof(Monom)*size); //We create a multiplication result array in which we will store the result of multiplying polynoms
checkMemoryAllocation(mulRes);
Monom temp; //We creat a temporary data type monom in which we will save the calculation of each multiplication
//We multiply the polynoms and keep the multiplication result in the mulRes array
for (j = 0; j < size1; j++) {
for (k = 0; k < size2; k++) {
temp.coefficient = polynom1[j].coefficient*polynom2[k].coefficient;
temp.power = polynom1[j].power + polynom2[k].power;
mulRes[i++] = temp;
}
}
polySort(mulRes, size); //We sort all of the elements by power size
mulRes = sumSamePowerPoly(mulRes, &size); //We unite all of the cells who has the same power
printPolynom(mulRes, size); //We print the multiplication result
free(mulRes); //We free the multiply result array after printing it
}
void checkMemoryAllocation(void *ptr)
/*This function check if the dynmic allocation we did has succseeded */
{
if (ptr == NULL)
{
printf("Memory allocation error\n");
exit(MEMORY_ERROR_EXIT);
}
}
这是预期的结果: 多项式的乘法为: 64x^8+112x^7+49x^6-80x^5-198x^4-112x^3+25x^2+80x+64 多项式之和为: 16x^4+14x^3-10x-16
非常感谢您的参与!
解决方案
在函数 GetPolynom 我发现这个:
if (logSize == phySize) {
phySize *= 2;
polyArr = (Monom*)realloc(polyArr, sizeof(Monom)*phySize);
checkMemoryAllocation(polyArr);;
}
这意味着您正在重新分配以 sizeof(Monom) * 2^(n-1) 形式呈指数增长的大小,其中 n 是“while”构造中当前循环的数量。
我觉得你应该改变
phySize *= 2;
为了
phySize += 1;
希望这可以帮助。
推荐阅读
- assembly - 我应该什么时候画屏幕
- linux - Bash 颜色字符编码去除
- c++ - LLVM GetAnalysis() 失败并需要通过
- angular - 如何使用@ViewChild 获取 HTML 元素 Angular
- c - 使用 libpcap 的 C 程序的 Makefile(依赖性问题)
- reactjs - MobX 如何使导入的组件可观察?
- r - 使用一个命令查找不同类型的缺失值 - 语法错误?
- python - 如何将输入放在记事本中并在 python2.7 中打开并使用这些值
- postgresql - 从 postgres 的文件夹中执行 sql 文件
- javascript - 如何创建一个进度条,它会在每 20% 和时间间隔(毫秒)内改变颜色,直到它被填满?