使用字符串参数创建 SDL_thread
Create SDL_thread with string parameter
我正在尝试制作一个以字符串作为输入的多线程程序。使用 SDL_CreateThread
,我尝试构建一个简单的实现,如下所示:
#include <stdio.h>
#include <string>
#include <SDL_thread.h>
int threadFunction(void* data) {
std::string* parameter = static_cast<std::string *>(data);
printf("Thread data: %s\n", parameter);
return 0;
}
int main(int argc, char const *argv[]) {
SDL_Thread* threadID = SDL_CreateThread(threadFunction, "test", (void*)"Enter string here");
SDL_DetachThread(threadID);
return 0;
}
它工作得很好,但是每当我将一个整数放入字符串中(例如 "123"
,而不是直接将数字 123
)然后尝试在线程中解析整数时,我得到一个Segmentation Fault: 11
。我的尝试是int i = std::stoi(parameter->c_str());
谁能解释一下为什么?是否与从 void*
投射有关?
好的,您首先将指向 char (void*)"Enter string here"
数组的指针作为线程参数传递,然后将此指针转换为指向字符串 static_cast<std::string *>(data)
的指针。 ::std::string 是一个 class 并且在任何情况下都不能接受执行此类转换。此外,当 printf("Thread data: %s\n", parameter)
时,您还隐式地将指向字符串的指针转换为指向字符数组的指针,但这不会引发错误,因为它确实指向字符数组,而不是字符串。
int threadFunction(void* data) {
const char * parameter = static_cast< const char * >(data); // correct cast
我正在尝试制作一个以字符串作为输入的多线程程序。使用 SDL_CreateThread
,我尝试构建一个简单的实现,如下所示:
#include <stdio.h>
#include <string>
#include <SDL_thread.h>
int threadFunction(void* data) {
std::string* parameter = static_cast<std::string *>(data);
printf("Thread data: %s\n", parameter);
return 0;
}
int main(int argc, char const *argv[]) {
SDL_Thread* threadID = SDL_CreateThread(threadFunction, "test", (void*)"Enter string here");
SDL_DetachThread(threadID);
return 0;
}
它工作得很好,但是每当我将一个整数放入字符串中(例如 "123"
,而不是直接将数字 123
)然后尝试在线程中解析整数时,我得到一个Segmentation Fault: 11
。我的尝试是int i = std::stoi(parameter->c_str());
谁能解释一下为什么?是否与从 void*
投射有关?
好的,您首先将指向 char (void*)"Enter string here"
数组的指针作为线程参数传递,然后将此指针转换为指向字符串 static_cast<std::string *>(data)
的指针。 ::std::string 是一个 class 并且在任何情况下都不能接受执行此类转换。此外,当 printf("Thread data: %s\n", parameter)
时,您还隐式地将指向字符串的指针转换为指向字符数组的指针,但这不会引发错误,因为它确实指向字符数组,而不是字符串。
int threadFunction(void* data) {
const char * parameter = static_cast< const char * >(data); // correct cast