Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Warning: cast to/from pointer from/to integer of different size

I'm learning Pthreads. My code executes the way I want it to, I'm able to use it. But it gives me a warning on compilation.

I compile using:

gcc test.c -o test -pthread 

with GCC 4.8.1. And I get the warning

test.c: In function ‘main’: test.c:39:46: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]      pthread_create(&(tid[i]), &attr, runner, (void *) i);                                               ^ test.c: In function ‘runner’: test.c:54:22: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]    int threadnumber = (int) param;                       ^ 

This error comes for the following code:

#include <pthread.h> #include <stdlib.h> #include <stdio.h>  #define MAX_THREADS 10  int sum; /* this data is shared by the thread(s) */ void *runner(void * param);  int main(int argc, char *argv[]) {   int num_threads, i;   pthread_t tid[MAX_THREADS];     /* the thread identifiers  */   pthread_attr_t attr; /* set of thread attributes */    if (argc != 2) {     fprintf(stderr, "usage:  test <integer value>\n");     exit(EXIT_FAILURE);   }    if (atoi(argv[1]) <= 0) {     fprintf(stderr,"%d must be > 0\n", atoi(argv[1]));     exit(EXIT_FAILURE);   }    if (atoi(argv[1]) > MAX_THREADS) {     fprintf(stderr,"%d must be <= %d\n", atoi(argv[1]), MAX_THREADS);     exit(EXIT_FAILURE);   }    num_threads = atoi(argv[1]);   printf("The number of threads is %d\n", num_threads);    /* get the default attributes */   pthread_attr_init(&attr);    /* create the threads */   for (i=0; i<num_threads; i++) {     pthread_create(&(tid[i]), &attr, runner, (void *) i);     printf("Creating thread number %d, tid=%lu \n", i, tid[i]);   }    /* now wait for the threads to exit */   for (i=0; i<num_threads; i++) {     pthread_join(tid[i],NULL);   }   return 0; }  /* The thread will begin control in this function */ void *runner(void * param) {   int i;   int threadnumber = (int) param;   for (i=0; i<1000; i++) printf("Thread number=%d, i=%d\n", threadnumber, i);   pthread_exit(0); } 

How can I fix this warning?

like image 313
user159 Avatar asked Jan 24 '14 03:01

user159


People also ask

How do you solve this warning cast to pointer from integer size?

Cast from a pointer to an integer of a different size The [-Wpointer-to-int-cast] warning is enabled by specifying the -Wall compiler option. Example 1: if (dir->d_name[0] == '. ' && dir->d_name[1] == (char) NULL) continue; if (dir->d_name[0] == '.

Can you cast a pointer to an int?

The most general answer is – in no way. In 64-bit programs, the size of the pointer is 64 bits, and cannot be put into the int type, which remains 32-bit in almost all systems. The only exception is exotic systems with the SILP64 data model, where the size of int is also 64 bits.


1 Answers

A quick hacky fix might just to cast to long instead of int. On a lot of systems, sizeof(long) == sizeof(void *).

A better idea might be to use intptr_t.

int threadnumber = (intptr_t) param; 

and

pthread_create(&(tid[i]), &attr, runner, (void *)(intptr_t)i); 
like image 96
tangrs Avatar answered Sep 22 '22 09:09

tangrs