Pezcraft
Pezcraft

Reputation: 299

Getting Segmentation Fault in C when using sleep with Pthreads

I am creating a thread in C with PThreads which executes a function that is running in an infinit loop and prints some random json string every second into the console. At the beginning he prints the result of the function simulateLED with no problem, but after sleeping for 1 second, I'll get a Segmentation Fault (Core dumped). If I remove sleep, I'll not get it and the program works fine. Why do I get a Segmentation Fault with sleeping and how to fix it?

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

char *simulateLED() {
    int temp;
    int luftf;
    char* jsonString;

    time_t t;
    srand((unsigned) time(&t));

    int x=-10, y=50;
    temp=(rand()%((y+1)-x))+x;

    x=2, y=30;
    luftf=(rand()%((y+1)-x))+x;

    printf("%d %d\n", temp, luftf);
    fflush(stdout);

    sprintf(jsonString, "{\n\"TEMP\": %d,\n\"HUMI\": %d\n}", temp, luftf);

    return jsonString;
}
void *simAndSendThread(void *param) {
    while(1) {
        printf("%s", simulateLED());
        sleep(1);
    }
}
int main(int argc, char *argv[]) {
    pthread_t thread;

    if(pthread_create(&thread, NULL, simAndSendThread, NULL)) {
        fprintf(stderr, "Error creating thread\n");
        return 1;
    }

    if(pthread_join(thread, NULL)) {
        fprintf(stderr, "Error joining thread\n");
        return 2;
    }

    pthread_exit(NULL);
    return 0;
}

Upvotes: 1

Views: 1697

Answers (2)

SRG
SRG

Reputation: 590

As @DavidSchwartz has pointed out, the reason for the Segmentation fault (core dumped) error is related to the jsonString pointer, that is currently not initialized (i.e., not pointing to anything). Hence, sprintf is writing to a random location, which might or might not work at times.

In order to fix it, you can statically assign space to the jsonString variable when you declare it, such as:

...
char jsonString[256];
...

This implies that you can have a string up to 255 characters (1 extra character reserved for \0). Alternatively, you can dynamically allocate the space using malloc:

...
char *jsonString = (char *)malloc(sizeof(char) * 256);

// Your code here

free(jsonString);
...

In this case, you must remember to release the allocation at the end of your function using free, otherwise you will leak memory. In case you haven't learned about dynamic memory yet, see When and why to use malloc?.

P.S.: If you are on Linux, I strongly recommend to use valgrind when you have memory-related errors. This tool will most probably hint where did you made the mistake. Check the Valgrind Quick Start Guide for more information.

Upvotes: 2

asio_guy
asio_guy

Reputation: 3767

You haven't allocated memory to jsonString and still trying to do sprintf and after return print

Try this

char* jsonString;
    jsonString = malloc( 1024 );

And don't forget to free once done, you are using a while(1) and if you don't free there is every chance that you'll hit the out of memory error very soon.

If you enable full warnings you should have received a warning message for uninitialized variable for which eventually would have avoided all the crahes.

Upvotes: 1

Related Questions