Как добавить данные указателя char (созданные с помощью malloc) в массив символов в C? - PullRequest
0 голосов
/ 11 мая 2019

В моем коде MPI на C я получаю слово от каждого из моих подчиненных процессов. Я хочу добавить все эти слова в массив символов на стороне мастера (часть кода ниже). Я могу напечатать эти слова, но не собирать их в один массив символов. (Я рассматриваю максимальную длину слова как 10, а число рабов как число рабов)

char* word = (char*)malloc(sizeof(char)*10);
char words[slavenumber*10];
for (int p = 0; p<slavenumber; p++){
    MPI_Recv(word, 10, MPI_CHAR, p, 0,MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("Word: %s\n", word); //it works fine
    words[p*10] = *word; //This does not work, i think there is a problem here.
}
printf(words); //This does not work correctly, it gives something like: ��>;&�>W�

Кто-нибудь может мне помочь в этом?

1 Ответ

0 голосов
/ 11 мая 2019

Давайте разберем это построчно

// allocate a buffer large enough to hold 10 elements of type `char`
char* word = (char*)malloc(sizeof(char)*10);

// define a variable-length-array large enough to
// hold 10*slavenumber elements of `char`
char words[slavenumber*10];

for (int p = 0; p<slavenumber; p++){
    // dereference `word` which is exactly the same as writing
    // `word[0]` assigning it to `words[p*10]`
    words[p*10] = *word;

    // words[p*10+1] to words[p*10+9] are unchanged,
    // i.e. uninitialized
}

// printing from an array. For this to work properly all
// accessed elements must be initialized and the buffer
// terminated by a null byte. You have neither
printf(words);

Поскольку вы оставили элементы неинициализированными и не завершили null, вы вызываете неопределенное поведение. Будь счастлив, что из носа не выползли демоны.

Если серьезно, то в C вы можете копировать строк простым присваиванием. Ваш случай использования требует strncpy.

for (int p = 0; p<slavenumber; p++){
    strncpy(&words[p*10], word, 10);
}
...