我尝试使用下面的代码将指针传递给包含要添加的两个数字的数组
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *print_message_function( void *ptr );
main()
{
pthread_t thread1, thread2;
/*const char *message1 = "Thread 1";
const char *message2 = "Thread 2"; */
int arr[2] = {5,8};
const int *ptrtoarr;
ptrtoarr=arr;
int iret1, iret2;
int *s=(int *)(ptrtoarr);
printf("%d \n", *s);
ptrtoarr++;
s=(int *)(ptrtoarr);
printf("%d \n", *s);
ptrtoarr--;
/* Create independent threads each of which will execute function */
iret1 = pthread_create( &thread1, NULL, print_message_function,&arr);
if(iret1)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1);
exit(EXIT_FAILURE);
}
/* iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
if(iret2)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2);
exit(EXIT_FAILURE);
} */
printf("pthread_create() for thread 1 returns: %d\n",iret1);
/* printf("pthread_create() for thread 2 returns: %d\n",iret2); */
/* Wait till threads are complete before main continues. Unless we */
/* wait we run the risk of executing an exit which will terminate */
/* the process and all threads before the threads have completed. */
pthread_join( thread1, NULL);
/* pthread_join( thread2, NULL); */
exit(EXIT_SUCCESS);
}
void *print_message_function( void *ptr )
{
/*char *message;
message = (char *) ptr;
printf("%s \n", message); */
printf("\n In message function \n");
int *sum=(int *)(ptr);
printf("%d \n", *sum);
sum = (int *)(ptr+1);
printf("%d \n", *sum);
}
但是在包含添加步骤的函数print_message_function中,使用指针我可以访问第一个数字而不是第二个数字。
(它访问主要功能中的两个数字)
输出如下
5 8 线程1的pthread_create()返回:0
在留言功能中 五 134217728
答案 0 :(得分:2)
下面,
sum = (int *)(ptr+1);
您正在对标准C中不允许的void *
(空指针)执行指针运算。通过将其大小视为1,GCC允许在void *
上进行指针运算。
应该是
sum = (int *)ptr+1;
更简洁的方法是使用sum
本身来获取下一个元素而不是ptr
:
void *print_message_function( void *ptr )
{
printf("\n In message function \n");
int *sum=ptr;
printf("%d \n", *sum);
sum++;
printf("%d \n", *sum);
return NULL;
}
我删除了转换,因为void *
与任何数据指针兼容。所以演员阵容是不必要的,并添加return NULL;
因为线程函数应返回void *
或调用pthead_exit()
。
GCC有一个选项-Wpointer-arith
来警告无效指针的指针算法。
答案 1 :(得分:0)
AnupW,
可能你的问题源于直接在你的线程函数中使用 ptr 。它是一个无效指针,所以你不知道你会得到什么。我会推荐你这个答案:
Concept of void pointer in C programming
特别是关于指针算术的答案。
尝试将 ptr 转换为类似于main(使用ptrtoarr)并使用它的int指针。