在转换和解除引用空格时出现分段错误*

时间:2016-04-28 13:57:37

标签: c multithreading casting

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

    #define EXIT_ON_NOT_ZERO(assignment, msg) if((assignment)!=0) { perror(msg); exit(EXIT_FAILURE); }

    void* produce(void* args) {
      return (void*) 1;
    }

    void* consume(void* args) {
      return (void*) 1;
    }

    int main() {
      pthread_t producer;
      pthread_t consumer;
      void* producerStatus;
      void* consumerStatus;
      EXIT_ON_NOT_ZERO(pthread_create(&producer, NULL, &produce, NULL), "Creating producer thread");
      EXIT_ON_NOT_ZERO(pthread_create(&consumer, NULL, &consume, NULL), "Creating consumer thread");
      EXIT_ON_NOT_ZERO(pthread_join(producer, &producerStatus), "Joining producer thread");
      EXIT_ON_NOT_ZERO(pthread_join(consumer, &consumerStatus), "Joining consumer thread");
      printf("Producer exited with status: %d\n", *(int*)producerStatus);
      printf("Consumer exited with status: %d\n", *(int*)consumerStatus);
      exit(EXIT_SUCCESS);
    }

我不明白为什么我不能同时施放和取消引用。

代码在到达第一个SEGFAULT时会导致printf

2 个答案:

答案 0 :(得分:1)

您无法做到这一点,因为(void *) 1会返回地址0x01并且取消引用它很可能是未定义的行为。

也许,你想投出&#34; 地址&#34;至intptr_t,根据标准完全有效。

答案 1 :(得分:0)

我按以下方式编写这种类型的代码(声明,分配,赋值和转换void *返回结果),而不是使用ommitNorm=true。在您的示例中,它看起来有点像这样:

return (void*)1

终端输出:

void* produce(void* args) {
 int *pret = calloc(1,sizeof(int)); 
 *pret = 1;
 return (void*) pret;
}

void* consume(void* args) {
 int *cret = calloc(1,sizeof(int));
 *cret = 1;
 return (void*) cret;    
}

希望这会有所帮助。否则,您会遇到由存储持续时间引起的 segfault 问题 - 正如之前评论中简要提到的那样。请务必仔细阅读有关POSIX线程编程的相关资料......