(开放MP)我得到奇怪的字符串,"r_saving"

(openmp) I get strange string, "r_saving"

本文关键字:字符串 saving MP 开放      更新时间:2023-10-16

我练习使用OpenMP,为此,我制作了一个非常简单的并行打印程序。

我有一个二维char*数组,我用以下函数填充它:

void addItem( char * arr[4][4], int row, int col ) {
    for ( int i=0; i< row; i++ ) {
        for ( int j=0; j< col; j++ ) {
            arr[i][j] = new char [10];
            strcpy( arr[i][j], "input");
            char * tmp = new char [5];
            *tmp = ( i + '0' );
            strcat( arr[i][j],tmp );
            delete [] tmp;
        }
    }
}

在我的主要功能中,我有以下内容:

int threadNum =4;
omp_set_num_threads(threadNum);
#pragma omp parallel
{
    #pragma omp for
    for ( int i=0; i<threadNum; i++ ) {
        cout << omp_get_thread_num() << endl;
        #pragma omp critical
        {
            printItem ( input, row, col );
        }
    }
}

printItem()功能的作用是打印阵列的元素

void printItem (char * arr[4][4], int row, int col) {
    for ( int i=0; i<row; i++ ) {
        cout << " row " << i << endl;
        for ( int j=0; j<col; j++ ) {
           cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}

输出为

01
row 0
input0 input0 input0 input0
row 1
input1 input1 input1 input1r_savings
row 2
input2 input2 input2 input2
row 3
input3 input3 input3 input3
32
row 0
input0 input0 input0 input0
row 1
input1 input1 input1 input1r_savings
row 2
input2 input2 input2 input2
row 3
input3 input3 input3 input3
.......

正如你所看到的,在每个线程的工作中,都有"r_saves",我没有在函数中添加它。

你能告诉我那是从哪里来的吗?我做错什么了吗?

您的问题与OpenMP或并行无关,而是与C字符串及其终止有关。

在以下代码中

arr[i][j] = new char [10];
strcpy( arr[i][j], "input");
char * tmp = new char [5];
*tmp = ( i + '0' );
strcat( arr[i][j],tmp );
delete [] tmp;
  1. 你分配了一个10个字符的字符串,然后在其中复制"input"。你的字符串现在是{ 'i', 'n', 'p', 'u', 't', '', ... }(AFAIK,最后4个元素有未定义的值)
  2. 然后分配一个5个字符的字符串tmp,将其第一个元素设置为与if索引i的值相对应的字符。tmp现在是(例如对于等于零的i{ '0', ... }
  3. 您注意到您的tmp字符串没有NULL终止符吗?这就是问题的原因。因为现在,当使用tmp作为第二个参数调用strcat()时,函数不知道在哪里停止复制。更具体地说,该函数将继续复制,直到它在tmp指向的内存中找到一个NULL字符,这可能需要一段时间,结果会很糟糕

我会按照您选择的样式为您的代码提供快速修复,但由于您使用的是C++,我强烈建议您使用std::string而不是char*来处理字符串。

因此,这应该"修复"你的代码的这一部分:

arr[i][j] = new char[10];
sprintf( arr[i][j], "input%d", i );