C 用pthred执行的函数释放堆分配区域会引发分段错误

C 用pthred执行的函数释放堆分配区域会引发分段错误,c,pthreads,C,Pthreads,上述函数传递给pthreads。当程序执行时,我得到一个分段错误。一旦我对调用free(sub)进行注释,我的代码就可以正常工作了。我不明白为什么?我们不能在线程中动态释放内存吗?因为堆在与主线程关联的所有对等线程之间共享 编辑1-完整代码 void *do_chld(void *arg) { char *sub; sub = malloc(255 * sizeof(char)); /* ------ Some Code ---- */

上述函数传递给pthreads。当程序执行时,我得到一个分段错误。一旦我对调用
free(sub)
进行注释,我的代码就可以正常工作了。我不明白为什么?我们不能在线程中动态释放内存吗?因为堆在与主线程关联的所有对等线程之间共享

编辑1-完整代码

void *do_chld(void *arg)
{
    char *sub; 
    sub = malloc(255 * sizeof(char));

    /*
        ------ Some Code ----
    */ 

    free(sub);
    pthread_exit((void *)0);
}
void*do\u chld(void*arg)
{
int new_fd=(int)arg;
int i,n,val;
char-buf[255];
char*sub;
sub=malloc(255*sizeof(char));
printf(“子线程[%d]:套接字编号=%d\n”,pthread\u self(),new\u fd);
/*从给定的套接字读取*/
n=读取(新的fd,buf,100);

如果(n这听起来像堆损坏-您是否尝试过在没有
/*--一些代码--*/
的情况下运行程序

虽然您显示的代码看起来不错,但未显示的代码可能已被覆盖(损坏)堆的一部分位于分配的内存之外。虽然这可能不会在内存损坏时导致故障,也不会在进程终止时导致故障,但您可以很容易地修改描述分配内存的数据结构,从而导致调用
free
失败

更新:查看您的第二次代码发布,事实上可能是您无意中修改了
sub
指针的值(也称为堆栈损坏)-可能是写入了
buf
的末尾。这几乎肯定会导致
free
失败

在调用
malloc
之后检查
sub
的值,然后在调用
free
之前再次检查,以确保其未更改


更新2:从头开始-thkala有正确的答案。

这听起来像堆损坏-您是否尝试在没有
/*--一些代码--*/
的情况下运行程序

虽然您显示的代码看起来不错,但未显示的代码可能已被覆盖(损坏)堆的一部分位于分配的内存之外。虽然这可能不会在内存损坏时导致故障,也不会在进程终止时导致故障,但您可以很容易地修改描述分配内存的数据结构,从而导致调用
free
失败

更新:查看您的第二次代码发布,事实上可能是您无意中修改了
sub
指针的值(也称为堆栈损坏)-可能是写入了
buf
的末尾。这几乎肯定会导致
free
失败

在调用
malloc
之后检查
sub
的值,然后在调用
free
之前再次检查,以确保其未更改


更新2:请注意-thkala的答案是否正确。

您正在向
指针分配字符串文字——“拼写正确”/“拼写不正确”字符串,然后尝试使用
free()
将其释放。字符串文字在代码中静态分配,无法释放

本质上,调用
free()
时的
sub
指针指向的是未分配给
malloc()
的内容

不过,我认为主要的问题是,当您可能想要进行字符串复制时,您需要执行指针赋值,以便字符串的内容位于从
malloc()
获得的区域中

编辑:

您可能想看看
strcpy()
strdup()
函数。
strcpy()
在您的情况下可以,不过如果您习惯了
strncpy()
会更好

strdup()
大致上是
strlen()+malloc()+strcpy()
的组合,通常是在堆内存区域中拥有字符串副本时最简单的选项,以便以后可以使用
free()
将其释放

编辑2:


在上面的代码中,只对响应消息使用
sub
缓冲区,然后释放它。如果这将是代码的最终行为,您只需删除
malloc()
free()
调用,可能就可以了。

您正在分配一个字符串文字,即“正确拼写”/“非直接拼写”字符串-指向
sub
指针,然后尝试使用
free()
将其释放。字符串文本在代码中静态分配,无法释放

本质上,调用
free()
时的
sub
指针指向的是未分配给
malloc()
的内容

不过,我认为主要的问题是,当您可能想要进行字符串复制时,您需要执行指针赋值,以便字符串的内容位于从
malloc()
获得的区域中

编辑:

您可能想看看
strcpy()
strdup()
函数。
strcpy()
在您的情况下可以,不过如果您习惯了
strncpy()
会更好

strdup()
大致上是
strlen()+malloc()+strcpy()
的组合,通常是在堆内存区域中拥有字符串副本时最简单的选项,以便以后可以使用
free()
将其释放

编辑2:

在上面的代码中,您只对响应消息使用
sub
缓冲区,然后释放它。如果这将是您的代码的最终行为,您只需删除
malloc()
free()
调用,可能就可以了。

B
void *do_chld(void *arg)
{

    int     new_fd = (int) arg;
    int     i,n,val;
    char buf[255];
    char *sub; 


    sub = malloc(255 * sizeof(char));

    printf("Child thread [%d]: Socket number = %d\n", pthread_self(), new_fd);

    /* read from the given socket */
    n = read(new_fd,buf,100);
    if(n<0){
            fprintf(stderr,"Receieving Failed\n");
            exit(2);
    }
    //process
    printf("Received %s \n",buf);

    val = checkSpelling(buf) ; 
    if(val){
        sub = "Correct Spelling";
    }
    else{
        sub = "InCorrect Spelling";

    }
    n = 0 ; 

    n = write(new_fd,sub,strlen(sub));
    if(n<0){
        fprintf(stderr,"Sending Failed\n");
        exit(2);
    }   


    /* close the socket and exit this thread*/
    close(new_fd);
        free(sub);
    pthread_exit((void *)0);
}