Как передать строку в качестве аргумента для потока в C - PullRequest
1 голос
/ 26 февраля 2020

Я новичок в C и программировании, и я пытаюсь передать строку в поток, чтобы потом манипулировать ею. Я попытался создать строку, используя массив char string[] = "word" и передать ее потоку - теперь указатель char *word = "word", но безуспешно. Как передать строку в качестве аргумента в поток ??

#include <stdio.h>
#include <stdlib.h> // exit calls
#include <pthread.h> // contains thread package

void *print_string_in_reverse_order(void *str)
{
    char *string = (char *)str;
    printf("%s\n", *string); // this won't print anything

    pthread_exit(NULL); // exit the thread
}

int main(int argc, char *argv[])
{
    pthread_t threadID;
    char *word = "word"; //should this be an array?
    printf("In function main(): Creating a new thread\n");

    // create a new thread in the calling process
    int status = pthread_create(&threadID, NULL, print_string_in_reverse_order, (void *)&word);

}

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020
  1. pthread_create(...., (void *)&word);

Вы передаете адрес указателю. &word имеет тип char** - это указатель на указатель на char. Таким образом, вы можете либо получить его как char**, а затем разыменовать указатель (а также убедиться, что адрес &word действителен для выполнения другого потока), либо просто передать вместо него word, как вы, вероятно, хотели это сделать.

printf("%s\n", *string); - *string - это char, а не char*. %s расширяет указатель на массив символов с нулевым символом в конце char*. Включите предупреждения компилятора и прослушайте их - компилятор должен предупреждать о таких ошибках.

Вы должны присоединиться к вашему потоку, прежде чем выходить из программы. Поскольку main выходит сразу после pthread_create, ваша программа завершается, другой поток также завершается. Поскольку второй поток не получает достаточно времени процессора для выполнения оператора printf, ничего не выводится (если остальная часть кода будет действительной ..

Так что, вероятно, вы хочу:

void *print_string_in_reverse_order(void *str) {
    char *string = str;
    printf("%s\n", string);
    return NULL;
}

int main(int argc, char *argv[]) {
    pthread_t threadID;
    const char *word = "word"; // string literals are immutable
    printf("In function main(): Creating a new thread\n");
    int status = pthread_create(&threadID, NULL, print_string_in_reverse_order, word);
    pthread_join(threadID, NULL);
}
0 голосов
/ 26 февраля 2020

Ваша проблема в том, что вы передаете указатель на указатель на строку, когда вы используете &word, вам нужно использовать только word в аргументе pthread_create.

Это происходит, когда вы объявить

const char* word = "my word";

память для "моего мира" выделяется в глобальной памяти только для чтения, а word становится указателем на эту память в стеке. Помните, что даже если вы не объявите word как const, вы не сможете изменить строку.

const char word[] = "my word";

создает большой массив для "моего слова". Обычно это небезопасно для передачи другому потоку, так как память удаляется, затем стек разворачивается в конце вашей функции.

Самый простой безопасный способ объявить изменяемую строку - это объявить что-то вроде:

static char word[] = "my word";

, который гарантирует, что «мое слово» находится в глобальной памяти и определенно будет доступно, в противном случае вам нужно будет выделить память, используя malloc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...