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

Dynamicaly declaring 2D array in C++

本文关键字:2D 数组 声明 动态 c++      更新时间:2023-10-16

我在主函数中创建了一个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,请建议我正确的实现。

首先注意二维数组是不可序列化的,因此正如其他答案所建议的那样,在您的情况下,一维数组可能是更好的方法。下面是原始的实现:

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)
{ }

如果你有任何问题请告诉我们。:)

二维数组在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

首先,您应该在堆中为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;

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

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

#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("%dt", array[0][0]);
        array[0][0] = 4;
        printf("%dt", array[0][0]);
        return;
}

如果你不想让数组歪斜;
如何创建一个一维数组并以二维方式访问它。

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;
}