在C ++中动态声明2D数组

时间:2014-03-18 00:16:43

标签: c++ arrays pthreads multidimensional-array

我在主函数中创建了一个2D数组,并希望在另一个函数中更新它。根据我的第一个想法,我需要动态声明数组,但问题是维度也应该是动态的 -

以下是我正在尝试的事情 -

int l;
int m;
int n;

void *Hello(void* rank); // Prototype of a thread function

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

int l = atoi(argv[2]);  
int m = atoi(argv[3]);  
int n = atoi(argv[4]);  

int A[l][m];

 pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
}

void *Hello(void* rank)
{ }

我想从* Hello函数更新数组A,请建议我正确实现。

4 个答案:

答案 0 :(得分:3)

首先请注意,二维数组不可序列化,因此正如其他答案所推荐的那样,在您的情况下,一维数组可能是更好的方法。这是天真的实现:

static int l, m, n; // static: local to compilation unit
int **A;

void *Hello(void* rank); // Prototype of a thread function

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

l = atoi(argv[2]);  
m = atoi(argv[3]);  
n = atoi(argv[4]);  

A = new int*[l]; // remember to free this!
for (int i = 0; i < l; ++i) {
    A[i] = new int[m];
}

 pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
}

void *Hello(void* rank)
{ }

这是另一个,带有可序列化的1-D数组来保存数据:

static int l, m, n; // static: local to compilation unit
int **A, *A_data;    

void *Hello(void* rank); // Prototype of a thread function

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

l = atoi(argv[2]);  
m = atoi(argv[3]);  
n = atoi(argv[4]);  

A_data = new int[l*m]; // remember to free this!
for (int i = 0; i < m; ++i) {
    A[i] = &A_data[i*l];
}

 pthread_create(&myThreads[thread_id], NULL,Hello, (void*)thread_id);
}

void *Hello(void* rank)
{ }

如果您有任何疑问,请告诉我们。 :)

答案 1 :(得分:2)

二维数组在C ++中并不常见:通常更简单(通常更好)只有一维数组并用它来存储你的所有数据:

int *A = new int[ l*m ];
// A[i][j] == A[ i*l + j%l ]

此外,在C ++中避免原始内存分配通常是一种很好的做法:而是使用std::vector或其他与数组语义相关的内容:

std::vector<int> A( l*m );
// A[i][j] == A[ i*l + j%l ]

或者,如果由于某些原因你真的需要一个二维数组:

std::vector< std::vector<int> > A( l, std::vector<int>(m) );
// A is a vector of l vectors of m ints

答案 2 :(得分:1)

首先,您应该为堆中的2D数组分配内存:

int **A = (int **)malloc(sizeof(int *) * l);
/* Error checking */
int i;
for(i = 0; i < l; ++i)
    A[i] = (int*)malloc(sizeof(int) * m);

请注意,数组不在连续的内存区域中 然后你需要使用第四个参数将A传递给Hello()

pthread_create(&myThreads[thread_id], NULL, Hello, (void*)A);

然后在函数Hello()中,将void*投回int**

int **array = (int**)rank;

之后,您可以从A函数更新数组Hello()

这是一个没有任何错误检查的例子:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

int l,m;

void *Hello(void* rank); // Prototype of a thread function

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

        l = atoi(argv[2]);
        m = atoi(argv[3]);
        int **A = (int **)malloc(sizeof(int *) * l);
        int i;
        for(i = 0; i <m; ++i)
                A[i] = (int*)malloc(sizeof(int) * m);

        A[0][0] = 3;
        pthread_t tid;
        pthread_create(&tid, NULL,Hello, (void*)A);
        pthread_join(tid, NULL);
        return 0;
}

void *Hello(void* rank)
{
        int **array = (int**)rank;
        printf("%d\t", array[0][0]);
        array[0][0] = 4;

        printf("%d\t", array[0][0]);
        return;
}

答案 3 :(得分:0)

如果你不想制作歪斜阵列;
如何创建一个d阵列并以二维方式访问它。

int l;
int m;
int n;

#define idx(i,j) i*m+j

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

    int l = atoi(argv[2]);
    int m = atoi(argv[3]);
    int n = atoi(argv[4]);

    int *A=(int*)malloc(sizeof(int)*l*m);
    memset(A,0,sizeof(int)*l*m);

    // Use the array like this
    // A[idx(i,j)]=10;

}