valgrind printf () ошибка с программой потока в c - PullRequest
0 голосов
/ 13 апреля 2020

Итак, я написал эту программу на c, и идея была в том, что она читает из 3 файлов и показывает их содержимое. Это работает нормально, но я получаю сообщение об ошибке при запуске с Valgrind. Это программа:

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


  struct structFile{
  int numFile;
  char* fileName;
 };

 void* fileThread(void* arg){
 struct structFile* threadStruct = (struct structFile*) arg;
 FILE *file = fopen(threadStruct->fileName, "r");`
 //char* charS = (char*) malloc(sizeof(char)*10);`
 char *charS = malloc(10 + 1);
 int sizeC = fread(charS, 1, 10, file);
 charS[sizeC] = '\0';
 while (sizeC < 10){
     charS[sizeC] = ' ';
     sizeC++; 
 }//while
 fclose(file);
 printf("%d. nit: %s\n", threadStruct->numFile, charS);
 return charS;

}//fileThread

int main(int argc, char **argv){
 pthread_t id[3]; 
 char* word[3];
 struct structFile* mainStruct = (struct structFile*) malloc (sizeof(struct structFile)*3);
 for (size_t i = 0; i < 3; i++){
     mainStruct[i].numFile = i;
     mainStruct[i].fileName = (char*)argv[i+1];
     pthread_create(&id[i], NULL, fileThread, mainStruct+i);
 }//for

 for (size_t i = 0; i < 3; i++){
     pthread_join(id[i], (void**) &word[i]);
 }//for
 printf("Sporocilo-> %s %s %s\n", word[0], word[1], word[2]);
 free(mainStruct);
 free(word[0]); 
 free(word[1]);
 free(word[2]);

 return 0;
 }//main

And this is the error I get: Я действительно понятия не имею, что может быть неправильно слышать, иногда это показывает 7 ошибок, иногда 4. Я начал с программирования c около 1 месяца go, так что это может быть простой ответ, заранее благодарю за помощь.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Проблема в том, что charS не имеет места для нулевого байта (так как вы хотите напечатать в виде строки с %s).

Выделите один дополнительный байт и правильно завершите его нулем.

char *charS = malloc(10 + 1); // sizeof(char) can be omitted as it's always 1
int sizeC = fread(charS, 1, 10, file);
charS[sizeC] = '\0';

...

Вы также должны добавить проверку ошибок для fopen, malloc, pthread_create, et c.

0 голосов
/ 13 апреля 2020

fread читает 10 символов, поэтому вам нужно выделить 11 символов для '\ 0'. Mallo c вот так:

         char* charS = malloc(sizeof(char) * 11);`
...