[英]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
分配內存
pthread_create(...., (void *)&word);
您將地址傳遞給指針。 &word
的類型為char**
- 它是一個指向char
指針。 因此,您可以將其作為char**
,然后取消引用指針(並確保地址&word
對另一個線程執行有效),或者只是按照您可能打算做的那樣傳遞word
。
printf("%s\\n", *string);
- *string
是char
,而不是char*
。 %s
一個指向char*
類型的以零結尾的字符數組的指針。 啟用編譯器警告並聽取它們 - 編譯器應該警告此類錯誤。
在退出程序之前,您必須加入您的線程。 因為main
在pthread_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.