数组

时间:2016-06-26 18:05:44

标签: c arrays function pointers

我正在编写我的代码块,并尝试在进程中使用指针算法。我的代码调用一个函数,然后假设要求用户输入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;
}

3 个答案:

答案 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] + 1scanf将此数字(这将是乱码)视为内存地址,程序崩溃。

你想要的是增加指针本身。但不是1,coeff + 1coeff[1]类似。而是使用pcoeff + 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