Что ты делаешь ?! Весь кастинг lpData очень, очень неправильный. Если вам нужно выполнить такое большое количество кастов, чтобы что-то сделать, вы, вероятно, делаете это неправильно.
В любом случае, ваш код должен выглядеть так:
DWORD WINAPI threadfn(LPVOID lpParam)
{
printf("Address of thread data:\n");
data *lpData = (data *)(lpParam);
for(int i=0; i<sizeof(lpParam); i++)
printf("%X\n", (int*)lpParam + i);
// Print out initial values
printf("\nInitial values:\n");
printf("a: %d\n", lpData->a);
printf("b: %.2f\n", lpData->b);
printf("c: %s\n", lpData->c);
// Modify thread data values
lpData->a = 200;
lpData->b = 25.80;
lpData->c = "Es la una";
return 0;
}
Вы должны использовать (data *)(lpParam)
, потому что это в основном переворачивает то, что происходит, когда вы звоните CreateThread
. Лично я думаю, что глупая нотация P
для имен типов является скорее помехой, чем помощью, потому что она затемняет то, что на самом деле происходит. Венгерская нотация вообще имеет эту проблему ИМХО.
В вашей функции main
у вас есть этот код:
hThread = CreateThread(NULL, 0, threadfn, &thread, 0, NULL);
4-й аргумент CreateThread
- это void *
(он же PVOID
). Тип выражения &thread
: data *
. Это означает, что data *
неявно преобразуется в void *
. Если вы сделаете это преобразование явным, код будет выглядеть так:
hThread = CreateThread(NULL, 0, threadfn, (void *)(&thread), 0, NULL);
Итак, чтобы «отменить» то, что было сделано, вам необходимо «отменить» приведение. Вам нужно превратить void *
обратно в data *
, что означает, что в threadfn
вам нужен код data *lpData = (data *)(lpParam);
.
Кроме того, вы преследуете бедствие, устанавливая c
, чтобы он указывал на постоянные символьные строки, поскольку вы не объявили его как const char *
. Я удивлен, что компилятор не выдает ошибку. Бедствие случается, когда вы делаете что-то вроде data.c[0] = 'f';
. Когда вы это сделаете, вы будете пытаться изменить память, которая может быть помечена как доступная только для чтения и вызвать сбой вашей программы. И это самое доброе, что могло случиться.