簡體   English   中英

如何將字符串作為參數傳遞給 C 中的線程

[英]How to pass a string as an argument for a thread in C

我是 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);

}

您的問題是,當您使用&word時,您將指針傳遞給指向字符串的指針,您只需要在pthread_create參數中使用word

這是因為當你聲明

const char* word = "my word";

“我的世界”的內存分配在只讀全局內存中,然后一個word成為堆棧上指向該內存的指針。 請注意,即使未將word聲明為 const,您也無法修改字符串。

const char word[] = "my word";

為“我的話”創建一個大數組。 這通常傳遞給另一個線程是不安全的,因為內存被刪除然后堆棧在函數結束時展開。

聲明可修改字符串的最簡單安全方法是聲明如下內容:

static char word[] = "my word";

這將保證“我的話”在全局內存中並且肯定可用,否則您將需要使用malloc分配內存

  1. pthread_create(...., (void *)&word);

您將地址傳遞給指針。 &word的類型為char** - 它是一個指向char指針。 因此,您可以將其作為char** ,然后取消引用指針(並確保地址&word對另一個線程執行有效),或者只是按照您可能打算做的那樣傳遞word

  1. printf("%s\\n", *string); - *stringchar ,而不是char* %s一個指向char*類型的以零結尾的字符數組的指針。 啟用編譯器警告並聽取它們 - 編譯器應該警告此類錯誤。

  2. 在退出程序之前,您必須加入您的線程。 因為mainpthread_create之后立即退出,您的程序退出,另一個線程也退出。 因為第二個線程沒有足夠的 CPU 時間來執行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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM