2016-06-07 100 views
-2

我试图迭代地在一个指针指针中存储一个2-d数组。我用随机高斯值填充它,但这不是重要的部分。我尝试填充由A指向的数组,但得到“错误的访问代码”错误。我将如何正确填充数组/指针?谢谢。在for循环C++中分配指针指针

INT主(){

int N = 100; 
double **A[N][N]; 
for(int i = 0; i< N; i++){ 
    for(int j =0; j < N; j++){ 
     random_device rd; 
     default_random_engine generator; 
     generator.seed(rd()); 
     normal_distribution<double> distribution(0.0,1.0); 
     **A[i][j] = distribution(generator); // error here, bad access code 1 
    } 
} 
+2

需要注意的是你的第二个行声明**指针的二维数组**的**双指针**。你只能改变'A [i] [j]'的值。如果你想为'** A [i] [j]'赋值,你必须首先使用'new'为它分配内存。 – Xiobiq

+0

警告:您不想在每次使用随机数生成器时重新生成种子。非常昂贵,可能会导致始终获得相同的数字,具体取决于'std :: random_device'的实现。在程序的开始附近对发生器进行种子处理。 – user4581301

回答

2

首先,改变double **A[N][N];double **A;。你想要一个双指针,而不是双指针矩阵。然后,你必须分配这样的内存:A=new double*[N];然后for(i=0;i<N;i++) A[i]=new double[n];然后一切都会正常工作。您将以正常方式访问矩阵元素,A[i][j],而不是**A[i][j]! 此示例代码将使您熟悉的概念:

#include <iostream> 

int main() { 

    int n=100; 

    double **a; 
    a=new double*[n]; 
    for(int i=0;i<n;i++) a[i]=new double[n]; 

    a[1][2]=3; 

    std::cout<<a[1][2]; 

    for(int i=0;i<n;i++) delete a[i]; 
    delete[] a; 

    return 0; 
} 
+1

你的代码不会'删除'分配的内存 – Xiobiq

+0

谢谢,这似乎工作。现在的问题是我试图使用svdcomp.C程序,你必须传递一个双指针。当我通过** A时,它给了我错误'没有匹配的调用函数。'有什么想法或建议吗? – PatEugene

+1

@PatEugene你可能想问一个单独的问题 – Xiobiq

1

的错误是在这里:double**

**A[i][j] = distribution(generator); 

A[i][j]存储值。因此,您需要先将您的随机值存储在有效地址中,然后将其存储在A中。

/*Assign a new double* pointer to A[i][j]*/ 
A[i][j] = new double*; 

/*Assign a new double pointer which is addressed by A[i][j]*/ 
*A[i][j] = new double; 

/*Assign value to **A[i][j] */ 
**A[i][j] = distribution(generator); 
+0

'A [i] [j] =分配(发生器)'将分配一个指向双指针的指针('double **')'double' – Xiobiq

+0

@Polikdir我不知道函数'distribution( )'返回,并认为它是'double **'类型。如果你能说出来会很棒。 –

+0

你应该在做这些事情之前检查过[documentation](http://en.cppreference.com/w/cpp/numeric/random/normal_distribution/operator())。这也很直观。 – Xiobiq

2

您无法使用非常量整数对其维度声明静态数组。

您正在声明一个指针数组,但指针并不指向任何有效的内存,这就是为什么您会收到内存错误。

尝试此代替:

const int N = 100; 

double A[N][N]; 

random_device rd; 
default_random_engine generator; 
generator.seed(rd()); 
normal_distribution<double> distribution(0.0,1.0); 

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N; ++j) { 
     A[i][j] = distribution(generator); 
    } 
} 

可替换地,在堆上分配,而不是堆栈阵列(然后可以使用尺寸的非const int的):

int N = 100; 

double **A = new double*[N]; 
for(int i = 0; i < N; ++i) { 
    A[i] = new double[N]; 
} 

random_device rd; 
default_random_engine generator; 
generator.seed(rd()); 
normal_distribution<double> distribution(0.0,1.0); 

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N; ++j) { 
     A[i][j] = distribution(generator); 
    } 
} 

... 

for(int i = 0; i < N; ++i) { 
    delete[] A[i]; 
} 
delete[] A; 

或者这:

int N = 100; 

double *A = new double[N*N]; 

random_device rd; 
default_random_engine generator; 
generator.seed(rd()); 
normal_distribution<double> distribution(0.0,1.0); 

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N; ++j) { 
     A[(i*N)+j] = distribution(generator); 
    } 
} 

... 

delete[] A; 

这样说,最好用std::vector代替new[]手动:

int N = 100; 

std::vector<std::vector<double> > A(N); 
for(int i = 0; i< N; i++) { 
    A[i].resize(N); 
} 

random_device rd; 
default_random_engine generator; 
generator.seed(rd()); 
normal_distribution<double> distribution(0.0,1.0); 

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N; ++j) { 
     A[i][j] = distribution(generator); 
    } 
} 

或者:

int N = 100; 

std::vector<double> A(N*N); 

random_device rd; 
default_random_engine generator; 
generator.seed(rd()); 
normal_distribution<double> distribution(0.0,1.0); 

for(int i = 0; i < N; ++i) { 
    for(int j = 0; j < N; ++j) { 
     A[(i*N)+j] = distribution(generator); 
    } 
} 
+0

@ M.M:我改变了我的答案。 –