为什么在此代码中抛出段错误?

时间:2017-04-21 19:35:12

标签: c dynamic malloc semaphore free

为什么以下代码会引发分段错误?如果我删除行sem_post(sem)或free(malloc(65536)),则不会抛出segfault。另外,free(malloc(65536))究竟意味着什么?

谢谢!

#include <stdlib.h>
#include <memory.h>
#include <semaphore.h>
#include <pthread.h>

int
main()
{
  sem_t *sem = (sem_t *)malloc(sizeof(sem_t)); 
  sem_init(sem, 0, 0);
  sem_post(sem);
  sem_wait(sem);
  sem_destroy(sem);
  free(sem);
  sem_post(sem);
  free(malloc(65536));
  return 0;
}

1 个答案:

答案 0 :(得分:3)

您在sem_post(sem);之后致电free(sem);free是一个释放程序正在使用的内存并将其返回给操作系统以便在另一个程序中使用的函数。在已释放的指针上调用任何函数是undefined behavior (UB)

此外,一旦你在信号量上调用了sem_destroy,它就不再是一个有效的信号量,除非你通过sem_init重新初始化它,否则不应该这样使用。