打印出两个复数乘积的程序-分段错误

  • 本文关键字:程序 错误 分段 两个 打印 c
  • 更新时间 :
  • 英文 :


我想写一个程序,生成两倍的向量as_re, as_im, bs_re, bs_im, cs_re,cs_im,每个向量的长度为30000,生成bs_re, bs_im, cs_re,cs_im的条目(任何类型的条目都可以(,然后使用一个名为multiply的函数将bscs的条目相乘,将结果保存为as。将一个as的随机条目打印到终端。

注意:multiply的签名必须是我写的,即没有返回类型,并且接受double*类型的所有六个参数。

我看了很多关于指针的视频,但我发现很难理解这个概念。我认为我的multiply函数更改了内存中具有不同地址的a_rea_im,而不是我全局声明的地址。但是,如果我已经全局声明了它们,那么main函数和multiply都应该看到它们?

以下是我所做的:

#include <stdio.h>
#include <stdlib.h>
// declaring the multiply function
void multiply(double* c_re, double* c_im, double* a_re, double* a_im, double* b_re, double* b_im);
// generating the vectors
int n = 30000;
double* as_re[n];
double* as_im[n];
double* bs_re[n];
double* bs_im[n];
double* cs_re[n];
double* cs_im[n];
double* a_re = 0;
double* a_im = 0;
int main(){
srand(time(NULL)) 
for (int i = 0; i < n; i++){
//filling the arrays with random numbers of type double* between 1 and 100.
bs_re[i] = (double*) rand() % 100 + 1;
bs_im[i] = (double*) rand() % 100 + 1;
cs_re[i] = (double*) rand() % 100 + 1;
cs_re[i] = (double*) rand() % 100 + 1;
multiply(cs_re[i], cs_im[i], &as_re[i], &as_im[i], bs_re[i], bs_im[i]);
as_re[i] = a_re;
as_im[i] = a_im;
printf("The product is %d + %din", as_re[i], as_im[i]);
}
}
void multiply(double* c_re, double* c_im, double* a_re, double* a_im, double* b_re, double* b_im){
*a_re = *c_re * *b_re - *c_im * *b_im;
*a_im = *c_re * *b_im + *c_im * *b_re;
}

我认为您可能想要生成一组随机的双值,然后将它们传递给乘法函数,但这不是您所拥有的。注意你所有的数组声明,像这个

double* bs_re[n];

是指向double的指针,而不是double本身。所以当你以后做这个任务时

bs_re[i] = (double*) rand() % 100 + 1;

您正在使指针指向一个随机生成的地址,这或多或少可以保证最终指向不应该指向的内存,并导致分段错误。

你应该做的是像这个一样将数组声明为double

double bs_re[n];

然后给他们分配一个像这样的随机值

bs_re[i] = (double) (rand() % 100 + 1);

然后将这些值的地址(即指向这些值的指针(传递到乘法中,这样它们就可以解引用您在上述步骤中分配的值。

multiply(&cs_re[i], &cs_im[i], &as_re[i], &as_im[i], &bs_re[i], &bs_im[i]);

由于multiply函数将答案直接放入as_reas_im中,因此调用后的赋值语句不需要进行乘法运算。

您也有一些其他错误,但这应该有助于您理顺指针部分。

rand生成一个int。然后,您指示编译器将该随机int视为指向双精度的指针,然后推迟该随机小地址,从而导致崩溃。将int转换为双精度。

相关内容

最新更新