我正在编写我的代码块,并尝试在进程中使用指针算法。我的代码调用一个函数,然后假设要求用户输入8个数字。然后使用指针将数字存储到数组中。我的问题是我遇到了分段错误。我相信这个问题与我的指针和地址有关。我认为导致此问题的代码块是scanf("%lf", *(coeff+1));
。这是否是引发错误的区域,如果是,那么解决这个问题的方法是什么?
#include <stdio.h>
void get_poly(double *coeff){
int p;
printf("Enter the eight coefficients: ");
for(p = 0; p < 7; p++){
scanf("%lf", *(coeff+1));
}
}
int main(void){
int i;
double coeff[7];
get_poly(coeff);
printf("output");
for(i = 0; i < 7; i++){
printf("%lf",coeff[i]);
}
return 0;
}
答案 0 :(得分:1)
scanf("%lf", *(coeff+1));
这里,您将错误类型的参数发送到scanf()
函数,因为*(coeff+1)
属于double
类型,而scanf()
需要指向double
的指针} ie,double*
类型参数。
解决方案:放弃
*
(解除引用)运算符
for(p = 0; p < 7; p++)
{
scanf("%lf", coeff+1);
}
没有错误,但它只在每次迭代中填充2 nd ,即coef[1]
元素..相反,你可以用p来填充整个数组
for(p = 0; p < 7; p++)
{
scanf("%lf", coeff+p);
}
答案 1 :(得分:0)
打开编译器警告,问题很明显。
$ make
cc -Wall -g test.c -o test
test.c:9:20: warning: format specifies type 'double *' but the argument has type 'double' [-Wformat]
scanf("%lf", *(coeff+1));
~~~ ^~~~~~~~~~
1 warning generated.
scanf
想要一个双指针,但是它被输入一个双精度值。
您要做的是通过循环增加coeff
来模拟coeff[p]
。 *(coeff+1)
实际上正在做的是获取coeff
指向的值并向其添加1。这类似于coeff[0] + 1
。 scanf
将此数字(这将是乱码)视为内存地址,程序崩溃。
你想要的是增加指针本身。但不是1,coeff + 1
与coeff[1]
类似。而是使用p
:coeff + p
。
您也有两次相同的off-by-one错误。你的for循环只迭代了7次。
for(i = 0; i < 7; i++) {
^
这将从0到6。一个简单的经验法则是,如果你想要迭代N次,你就放i < N
。这是有效的,因为数组是0索引的。
就get_poly
的设计方式而言,这里没有理由要求用户传入已经分配的指针。这需要用户做额外的工作,并知道有多少元素get_poly
会读取。如果get_poly
想要阅读更多内容,则调用它的所有代码都将中断。
相反,让get_poly
进行分配。然后你也可以使用参数来询问它应该读取多少个数字。这使得功能更安全,更灵活。
最后,我一直使用i
作为for循环迭代器。这是一个标准约定,使用p
(多项式?)模糊它只是一个循环迭代器(它甚至不计算多项式)。
#include <stdio.h>
#include <stdlib.h>
double *get_poly(int num_coeffs){
int i;
double *coeffs = calloc(num_coeffs, sizeof(double*));
printf("Enter the %d coefficients: ", num_coeffs);
for(i = 0; i < num_coeffs; i++){
scanf("%lf", coeffs + i);
}
return coeffs;
}
int main(void){
int i;
double *coeffs = get_poly(8);
printf("output: ");
for(i = 0; i < 8; i++){
printf("%lf ",coeffs[i]);
}
printf("\n");
return 0;
}
您应该避免使用scanf
,而应使用fgets
+ sscanf
作为all the reasons outlined here。我把它留作练习。
答案 2 :(得分:-1)
此解决方案的答案如下,由@ BLUEPIXY提供
request_finished