【问题标题】:Dealing with array initialized in and out of functions处理在函数内外初始化的数组
【发布时间】:2015-01-24 01:19:23
【问题描述】:

我有一个函数,它接受并返回指针的指针(即通过 malloc() 2d 数组动态分配,因此:矩阵)。在尝试在内存分配在函数内部和外部的指针之间传递指向两个的元素时,我遇到了麻烦。我知道这里一定有一些关于指针的非常重要的东西让我无法理解,请你照亮我吗?

double** initialize(int N,int M); // ..allocates memory for me and gives me back the "pointer to a matrix".

double** A = initialize(int N,int M);

double** myfun(double** A){

double** P;
P = initialize(int L,int K);

// .. I wanna write element "of" A to the newly allocated memory pointed by P
// .. this crashes

P[l][k] = A[i][j];

// .. this works fine
double temp;
temp = A[i][j];

P[l][k] = temp;

return P;

}

编辑:这是初始化的工作方式。我不想在此处调试代码或构建适当的矩阵,我只想了解此实例中指针的具体行为。这里的代码本质上是伪代码。

    double** A = initialize(int N,int M){ // .. i.e. something along the line of:

 double** A;
      A =  (double**) malloc((N)*sizeof(double*));
      A[0] =  (double*) malloc(area*sizeof(double));
      A[1] = A[0] + 1;
      for (int i=2; i<N; i++) A[i] = A[i-1] + M;

      /* Initialize to zero */
      for (int i=0; i<N; i++) for (int j=0; j<M; j++) A[i][j] = 0;

};

【问题讨论】:

  • 您发布的代码没有意义。 P = initialize(int L,int K); 是语法错误。如需调试帮助,请发帖MCVE
  • 无论如何,您都不应该在 C++ 中为此使用原始指针和 malloc。使用vector&lt;vector&lt;double&gt;&gt;,这样分配内存不会出错。
  • 避免使用数组。将它们放入一个类中,并将其称为矩阵。如果需要,矩阵类将更容易传递给函数并在动态内存中分配。
  • (我同意 cmets 应该使用适当的库类型。)请显示您的分配代码、初始化代码和代码示例。 (我同意 cmets re MCVE。)
  • 我很清楚这不是做事的方式,我现在对制作一个好的矩阵类不感兴趣。问题仅与此特定实例中指针的行为有关。

标签: c++ arrays pointers casting malloc


【解决方案1】:

您的示例用法与我们猜测的预期用法一致。

在初始化中:大概area的值是N * M。在

  A[1] = A[0] + 1;
  for (int i=2; i<N; i++) A[i] = A[i-1] + M;

在第一行中,+ 1 应该是 + M。你应该写

for (int i=1; i<N; i++) A[i] = A[i-1] + M;

你也需要

return A;

由于您实际上并未给出您运行的代码或说出“崩溃”的含义,因此这可能不是您的(唯一)问题。如需调试帮助,请发帖MCVE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2015-01-02
    • 2011-06-02
    相关资源
    最近更新 更多