问题是添加两个用户定义的多项式数据类型。我的代码如下。我尝试编写一个代码,通过使用 malloc 创建动态数组,只占用必要的内存。
请帮我更正此代码。我对双指针和动态数组的概念很陌生。
#include <stdio.h>
#include <stdlib.h>
typedef struct Polynomial {
int numTerms;
int ** expo;
int ** coff;
}
polynomial;
void polyInput(polynomial poly) {
int i;
int * ptr1;
int * ptr2;
ptr1 = (int * ) malloc(sizeof(int) * poly.numTerms);
ptr2 = (int * ) malloc(sizeof(int) * poly.numTerms);
printf("Enter the pair of exponent and coefficient:\n");
for (i = 0; i < poly.numTerms; i++)
scanf("%d %d", & ptr1[i], & ptr2[i]);
poly.expo = & ptr1;
poly.coff = & ptr2;
}
void polyPrint(polynomial poly) {
int i;
for (i = 0; i < poly.numTerms; i++)
printf("(%d, %d) ", ( * poly.expo)[i], ( * poly.coff)[i]);
}
polynomial polySum(polynomial poly1, polynomial poly2) {
int n1 = poly1.numTerms;
int n2 = poly2.numTerms;
if (( * poly1.expo)[n1 - 1] > ( * poly2.expo)[n2 - 1]) {}
return polySum(poly2, poly1);
int i = 0, j = 0, k = 0;
polynomial sumOfPoly;
* sumOfPoly.coff = (int * ) malloc(50 * sizeof(int));
* sumOfPoly.expo = (int * ) malloc(50 * sizeof(int));
while (i < n1 && j < n2) {
if (( * poly1.expo)[i] < ( * poly2.expo)[j]) {
( * sumOfPoly.expo)[k] = ( * poly2.expo)[j];
( * sumOfPoly.coff)[k] = ( * poly2.expo)[j];
k++;
j++;
} else if ( * poly1.expo[i] > * poly2.expo[i]) {
( * sumOfPoly.expo)[k] = ( * poly1.expo)[i];
( * sumOfPoly.coff)[k] = ( * poly1.coff)[i];
k++;
i++;
} else {
// Check for special case
if (( * poly1.coff)[i] + ( * poly2.coff)[j] != 0) {
( * sumOfPoly.expo)[k] = ( * poly1.expo)[i];
( * sumOfPoly.coff)[k] = ( * poly1.coff)[i] + ( * poly2.coff)[j];
k++;
}
i++;
j++;
}
}
while (i < n1) {
( * sumOfPoly.expo)[k] = ( * poly1.expo)[i];
( * sumOfPoly.coff)[k] = ( * poly1.coff)[i];
k++;
i++;
}
sumOfPoly.numTerms = k;
return sumOfPoly;
}
int main() {
polynomial poly1, poly2;
int i;
printf("Enter the number of terns in 1st polynomial: ");
scanf("%d", & poly1.numTerms);
polyInput(poly1);
printf("Enter the number of terms in 2nd polynomial: ");
scanf("%d", & poly2.numTerms);
polyInput(poly2);
polynomial sumOfPoly;
sumOfPoly = polySum(poly1, poly2);
polyPrint(sumOfPoly);
return 0;
}
上面的代码应该从用户那里获取两个多项式,然后返回并打印多项式的和。
输入数据后我没有得到任何输出。我只遇到了分段错误。输出是:
Enter the number of terns in 1st polynomial: 3
Enter the pair of exponent and coefficient:
2 1
1 5
0 -3
Enter the number of terms in 2nd polynomial: 3
Enter the pair of exponent and coefficient:
3 2
2 -3
0 6
Segmentation fault
请指出我在这段代码中的错误以及我应该更改哪些内容来纠正它。
除了评论中提到的各种问题之外,导致分段错误的主要问题是您将
polynomial
结构体按值传递到 polyInput
函数中。因此,程序在调用该函数时会获取 poly1
和 poly2
对象的 copy,因此该副本就是正在更新的内容,而不是原始对象。因此,由于它们没有初始化,所以它们包含当时内存中的任何内容,从而导致 UB(未定义行为),特别是当代码尝试访问指针时出现分段错误。 这是示例代码,基于您的代码,但做了一些更改,例如使用正确的转换和初始化
poly1
结构,因为如果我不这样做,我的编译器 VS 2017 会抱怨。
#include <stdio.h>
#include <stdlib.h>
typedef struct Polynomial {
int numTerms;
int ** expo;
int ** coff;
}
polynomial;
void polyInput(polynomial poly) {
poly.numTerms = 1;
poly.expo = (int **) malloc(sizeof(int*) * poly.numTerms);;
poly.coff = (int **) malloc(sizeof(int*) * poly.numTerms);;
}
void polyInput2(polynomial* poly) {
poly->numTerms = 1;
poly->expo = (int **) malloc(sizeof(int*) * poly->numTerms);;
poly->coff = (int **) malloc(sizeof(int*) * poly->numTerms);;
}
int main()
{
polynomial poly1 = {0, NULL, NULL}, poly2 = {0, NULL, NULL};
polyInput(poly1);
printf("%d %p %p\n", poly1.numTerms, poly1.expo, poly1.coff);
polyInput2(&poly2);
printf("%d %p %p\n", poly2.numTerms, poly2.expo, poly2.coff);
return 0;
}
注意
polyInput
和
polyInput2
基本上做同样的事情,但是第一个使用值传递,就像你的函数一样,而第二个则使用指针,所以任何更改也会在你传递给的对象中发生它。运行它会产生以下输出:
0 00000000 00000000
1 00CE4918 00CE4928
如您所见,第一组值保留为我初始化时使用的 0 值,只有第二组值具有函数设置的值。
poly.expo = & ptr1;
保存局部变量
ptr1
的地址。稍后在其他例程中使用 .expo
的代码存在使用无效指针的风险。相反,保存分配的指针。
poly.expo = anything;
是一个问题,因为它保存到本地参数
poly
中,这不会影响调用代码的参数。相反,调用代码可以将 polynomial
对象的地址传递给
polyInput()
。//void polyInput(polynomial poly) {
void polyInput(polynomial *poly) {
//int i;
//int * ptr1;
//int * ptr2;
//ptr1 = (int * ) malloc(sizeof(int) * poly.numTerms);
//ptr2 = (int * ) malloc(sizeof(int) * poly.numTerms);
poly->expo = malloc(sizeof poly->expo[0] * poly.numTerms);
poly->coff = malloc(sizeof poly->coff[0] * poly.numTerms);
if (poly->expo == NULL || poly->coff == NULL) {
Handle_error_with_TBD_code;
}
printf("Enter the pair of exponent and coefficient:\n");
// for (i = 0; i < poly.numTerms; i++)
for (int = 0; i < poly.numTerms; i++) {
// scanf("%d %d", & ptr1[i], & ptr2[i]);
scanf("%d %d", &poly->expo[i], &poly->coff[i]);
}
//poly.expo = & ptr1;
//poly.coff = & ptr2;
}
// Calling code
//polyInput(poly1);
polyInput(&poly1);
其他检查
scanf()
的返回值。