передача указателя char char для функции в streamе

Когда я выполняю этот код, я получаю «ошибку сегментации (core dumbed)».

#include  #include  void function(char *oz){ char *y; y = (char*)oz; **y="asd"; return NULL; } int main(){ char *oz="oz\n"; pthread_t thread1; if(pthread_create(&thread1,NULL,function,(void *)oz)){ fprintf(stderr, "Error creating thread\n"); return 1; } if(pthread_join(thread1,NULL)){ fprintf(stderr, "Error joining thread\n"); return 2; } printf("%s",oz); return 0; } 

Сначала вам нужно решить, как вы хотите управлять памятью: это память, выделенная вызывающим, или внутри функции streamа.

Если память выделена вызывающим, то функция streamа будет выглядеть так:

 void *function(void *arg) { char *p = arg; strcpy(p, "abc"); // p points to memory area allocated by thread creator return NULL; } 

Использование:

 char data[10] = "oz"; // allocate 10 bytes and initialize them with 'oz' ... pthread_create(&thread1,NULL,function,data); 

Если память выделена внутри функции streamа, вам необходимо передать указатель на указатель:

 void *function(void *arg) { char **p = (char**)arg; *p = strdup("abc"); // equivalent of malloc + strcpy return NULL; } 

Использование:

 char *data = "oz"; // data can point even to read-only area ... pthread_create(&thread1,NULL,function,&data); // pass pointer to variable ... free(data); // after data is not needed - free memory- 

Ваш компилятор может предупредить вас о некоторых из этих проблем. Не игнорируйте предупреждения компилятора! Предупреждения – это то, как ваш компилятор говорит вам: « Держись! Я не совсем понимаю этот кусочек кода … Пожалуйста, поставь его на понятном мне языке! ». Какую книгу ты читаешь? Я вижу другие проблемы, о которых я не буду упоминать в этом вопросе, вытекающих из этого подхода. Небезопасно изучать C по «проб и ошибок» или «ошибочным примером» (например, копирование / вставка и изменение). Вы должны читать книгу, написанную профессором, который учит программированию для жизни, и имеет чертовски хорошую репутацию для этого. Пожалуйста, ответьте на этот вопрос, прежде чем читать дальше.

pthread_create ожидает указатель функции, который указывает на функцию с такой сигнатурой:

 void *function(void *argument); 

Указатель функции, который вы передаете, будет преобразован в указатель функции, который предполагает эту подпись. Затем pthread_create попытается использовать этот указатель функции, единственный способ, которым он знает, как … Это неопределенное поведение. … и, кроме того, как указано @AdamRosenfield, вы не можете возвращать значения из функции, которая возвращает void . Это должно заставлять ваш компилятор выводить на вас ошибки и предупреждения. Ваша функция должна выглядеть так:

 void *function(void *oz) { /* ... */ } 

В блочном комментарии есть еще одна серия лжи в вашем вопросе. Ваш код не работает, потому что он не компилируется. y является char **y является char**y является ошибкой компилятора. Я бы предположил, что вы только хотели разыграть его один раз, но тогда присвоение "asd" char тоже не имеет смысла, поэтому я должен предположить, что вы хотели объявить y как char **y; , Вы, кажется, используете typecasts излишне. Узнайте о них, прежде чем использовать их, чтобы вы не злоупотребляли ими или использовали их в тех местах, где вам не нужно (например, пытаться преобразовать char * в char * … wtf?).

 void *function(void *oz) { char **y = oz; *y = "asd"; } 

Следовательно, вы, вероятно, должны передавать значение pthread_open значение char ** . Нет смысла передавать значение char * а затем обрабатывать его, как будто это значение char ** , правильно? Не нужно указывать какой-либо указатель на объект на void * ; Это преобразование является одним из автоматических.

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