处理C中的指针数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理C中的指针数组相关的知识,希望对你有一定的参考价值。

我正在尝试使用指针在C中实现卷积算法。

我知道我的deconvolution.c代码是正确的。但是,我很难调用Main中的函数来获得所需的结果。任何帮助深表感谢。

 // deconvolution.c
 #include "deconvolution.h"
 #include "math.h"

 void deconvolution (double *Win, double *Vin, int *N, int *j, int *L, double *ht, double *gt, double *Vout)
 {
     int k, n, t;
     for(t = 0; t < *N; t++) {
         k = t;
         Vout[t] = (ht[0] * Win[k]) + (gt[0] * Vin[k]);
         for(n = 1; n < *L; n++) {
            k += (int) pow(2.0, (double) *j - 1.0);
             if(k >= *N) k -= *N;
             Vout[t] += (ht[n] * Win[k]) + (gt[n] * Vin[k]);
         }
     }
  }


  //////////////

 // deconvolution.h
 #include <stdio.h>

 void deconvolution (
                     double *Win, double *Vin, int *N, int *j, int *L, double *ht, double *gt, double *Vout);

  //////////////

 // main.c
 #include <stdio.h>

 int main(int argc, const char * argv[]) {

     int N = 9; // Size of Win and Vin
     int J = 3; // Levels
     int L = 4; // Size of gt and ht

    double *Vout = NULL; // output will be stored here

     double Win = {1.0, -2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, -9.0};
     double Vin = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, -7.0, 8.0, 9.0};
     double ht = {-1.0, 2.0, -3.0, -4.0};
     double gt = {-1.0, 2.0, 3.0, -4.0};

     deconvolution (
               Win, Vin, N, J, L, ht, gt, Vout);

 // Should Print Vout = {40.0, -16.0, -42.0, 24.0, -74.0, -8.0, -8.0, -46.0, -8.0}
 // But I get an error

     return 0;
 }
答案

你的函数原型有一些声明为指针的整数常量

void deconvolution (double *Win
                    , double *Vin
                    , int *N
                    , int *j
                    , int *L
                    , double *ht
                    , double *gt
                    , double *Vout)

但是当你调用deconvolution时,你不会将地址传递给这些常量

deconvolution ( Win, Vin, N, J, L, ht, gt, Vout); // &N,&J,&L

您应该将反卷积更改为普通的整数,因为您没有在函数中更改N,J,L,因此没有理由将地址传递给它们。

void deconvolution (double *Win
                    , double *Vin
                    , int N
                    , int j
                    , int L
                    , double *ht
                    , double *gt
                    , double *Vout)

Vout btw设置为NULL,因此如果你需要写入Vout你会得到一个错误,你需要分配内存,如果你已经知道大小,可以在函数deconvolution内部或外部完成。如果你想在你的函数中分配Vout,你需要将double* Vout更改为double** Vout,以便你可以改变Vout指向的内容。

另一答案

就像coderredoc所说,Vout没有初始化为记忆,它需要像double *Vout = malloc(N*sizeof(double))

但是对你来说更有用的是启用编译器警告(例如在GCC中使用-Wall完成)。在这种情况下还有更多的警告。然后我会修复警告。

然后在调试器(例如GDB)中运行该程序。调试器显示哪条线路崩溃,然后你看看它崩溃的原因:该线路/需要什么。在这种情况下,行说Vout[t] = ...,所以你对自己说“让我检查Vout是否为空指针”。

另一答案

这不是正确的代码。

首先,函数定义不正确。在主函数中,你调用deconvolution函数,如“deconvolution(Win,Vin,N,J,L,ht,gt,Vout);.但是,N,J,L不是指针变量。

如果你想调用这个表单,你应该定义“void deconvolution(double * Win,double * Vin,int N,int j,int L,double * ht,double * gt,double * Vout);或者你应该调用deconvolution比如deconvolution(Win,Vin,&N,&J,&L,ht,gt,Vout);

接下来,“double * Vout = NULL;”不是数组。它是指针变量。这意味着,Vout上没有分配内存地址。如果你想得到正确的结果,你应该写“double Vout [9];”。

最后,Win,Vin,ht和gt没有明确定义。在代码中,它是数组。但是,在你的代码中它是双类型变量。所以,你应该说“Win [],Vin [],ht [],gt []”。

你将改变下面的代码,你可以得到很好的结果。

int main(int argc,const char * argv []){

int N = 9; // Size of Win and Vin
int J = 3; // Levels
int L = 4; // Size of gt and ht

double Vout[9]; // output will be stored here

double Win[] = {1.0, -2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, -9.0};
double Vin[] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, -7.0, 8.0, 9.0};
double ht[] = {-1.0, 2.0, -3.0, -4.0};
double gt[] = {-1.0, 2.0, 3.0, -4.0};

deconvolution (Win, Vin, &N, &J, &L, ht, gt, Vout);

// Should Print Vout = {40.0, -16.0, -42.0, 24.0, -74.0, -8.0, -8.0, -46.0, -8.0}
// But I get an error

return 0;

}

以上是关于处理C中的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

C 语言数组 ( 指针数组用法 | 命令行参数处理 )

C语言指针,下标,

C数组和指针

当指针指向数组时,为啥 operator(*) 的值不起作用?

C 代码中的 Java 数组

20160211.CCPP体系详解(0021天)