Warnung: zum / vom Zeiger von / zu Integer unterschiedlicher Größe umwandeln
Ich bin Lern-Pthreads. Mein code ausgeführt wird, wie ich es möchte, ich bin in der Lage, es zu benutzen. Aber es gibt mir eine Warnung auf der compilation.
Ich kompilieren mit:
gcc test.c -o test -pthread
mit GCC-4.8.1. Und ich bekomme die Warnung
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;
^
Kommt dieser Fehler für den folgenden 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);
}
Wie kann ich dieses Problem beheben Warnung?
InformationsquelleAutor der Frage user159 | 2014-01-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen schnellen hacky fix vielleicht einfach nur zu werfen, um
long
stattint
. Auf eine Menge von Systemen, diesizeof(long) == sizeof(void *)
.Eine bessere Idee könnte es sein, zu verwenden
intptr_t
.und
InformationsquelleAutor der Antwort tangrs
Übergeben Sie das lokale variable
i
als argument fürrunner
sizeof(void*) == 8
undsizeof(int) == 4
(64 bit).Wenn Sie übergeben möchten
i
sollten Sie wickeln Sie es als ein Zeiger oder so etwas:Können Sie wollen einfach nur
i
- und in diesem Fall, die folgenden sicher sein sollte (aber weit von empfohlen):InformationsquelleAutor der Antwort Juan Ramirez
Ich war auch immer die gleiche Warnung. So lösen meine Warnung, die ich konvertiert int zu lang und dann diese Warnung einfach verschwunden. Und zu der Warnung, "cast to pointer from integer of different size" können Sie diese Warnung, da ein Zeiger zu halten, kann der Wert der variable, weil Zeiger in der 64x ist der 64 bit-und 32 ist 32-bit.
InformationsquelleAutor der Antwort newbie
Versuchen vorbei
InformationsquelleAutor der Antwort venkatesh