2017-10-17 22 views
0

J'ai essayé de suivre les procédures de plusieurs réponses/tuturials et je reçois toujours la faute de segmentation en passant de multiples arguments à un thread? Qu'est-ce que je fais mal?Comment passer plusieurs arguments à filer dans c? [Segmentation fault]

struct:

struct client_struct { 
    int socketId; 
    char *message; 
}; 

fonction processus:

// Handle socket session 
void *process(void *client) 
{ 
    client_struct *tmpClient = (client_struct*)client; 
    char sendline[BUFFSIZE], recvline[BUFFSIZE]; 
    printf("can't reach this: %i\n", tmpClient->socketId); 
    strncpy(sendline, tmpClient->message, sizeof(sendline)-1); 
    sendline[sizeof(sendline)-1] = '\0'; 
} 

appelée main:

int sendMessage(const char *message, int sock) 
{ 
    int result; 
    pthread_t process_thread; 

    struct client_struct * client; 
    client->socketId = sock; 
    strcpy(client->message, message); 
    printf("segmentation fault here: %s\n", client->message); 

    pthread_create(&process_thread, NULL, process, client); 
    pthread_detach(process_thread); 
} 
+1

Vous avez votre pointeur 'Client', mais vous ne semblent pas faire * * le point partout? Les variables locales non initialisées auront une valeur * indéterminée * (qui semblera presque aléatoire). Le fait de déréférencer une telle variable pointeur conduit à [* undefined behavior *] (https://en.wikipedia.org/wiki/Undefined_behavior) et est un moyen très courant d'obtenir des plantages. –

+1

Vous avez probablement oublié d'initialiser 'client':' struct client_struct * client = malloc (sizeof * client); ' – usr

+0

Puis, après ce qui précède, vous continuez à utiliser des pointeurs non initialisés, à quoi va pointer' client-> message'? Que pensez-vous qu'il se passe lorsque vous avez ce pointeur comme destination pour un appel 'strcpy'? –

Répondre

1

problème classique avec un comportement non défini lorsque le pointeur est pas initialisé.

struct client_struct * client; 

client = malloc(sizeof(*client)); //Allocate memory for client 
client->... = ...; //DO you job 

En faisant la variable struct client_struct * client; vous déclarez seulement qui (probablement à un moment donné) pointer vers des données de type struct client_struct. Comme vous n'avez pas encore vos données, le déréférencement d'un pointeur non initialisé conduit à un comportement indéfini.

En utilisant malloc, vous configurez des données valides pour votre pointeur.

+0

cette ligne me donne l'erreur suivante: conversion invalide de 'void *' en 'client_struct *' [-fpermissive] –

+1

On dirait que vous n'êtes pas en C mais en C++. Utilisez 'client = (struct client_struct *) malloc (sizeof (* client));' – tilz0R

+0

yh, juste fait cela juste avant de commenter, cela a fonctionné: p désolé de vous déranger, j'ai déjà accepté votre awnser ainsi;) –

0

Un struct simple, de proxyargs peut également être utilisé:

struct Args 
{ int a; float f; char msg[10]; }; 
... 
static void* callback(void* userData) 
{ 
Args* a = (Args*) userData; 
/* use args here */ 
} 
... 
Args mArgs = {10, 2.0, "message"}; 
pthread_create(&thread,NULL, callback, (Args*)&mArgs); 
enter code here