Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中释放字符串时出现分段错误_C_Segmentation Fault_Free - Fatal编程技术网

在C中释放字符串时出现分段错误

在C中释放字符串时出现分段错误,c,segmentation-fault,free,C,Segmentation Fault,Free,当我试图释放从“new_job->jobs_address”指向的字符串的分配内存时,出现了“segmentation fault”错误。我已经为我的字符串分配了足够的内存(即使我分配的内存远远超出了我的需要,我仍然有这个问题),但是仍然存在这个错误 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct job_t { pid_t pid; time

当我试图释放从“new_job->jobs_address”指向的字符串的分配内存时,出现了“segmentation fault”错误。我已经为我的字符串分配了足够的内存(即使我分配的内存远远超出了我的需要,我仍然有这个问题),但是仍然存在这个错误

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct job_t {
    pid_t pid;
    time_t creation_time;
    bool stop;
    bool foreground;
    char * jobs_adress;
} Job;

int main() {

    char * jobs_adress = "string";

    /* creating an object of "Job" Type */
    printf("another try");
    Job * new_job = (Job*)malloc(sizeof(new_job));
    if(!new_job) {
        return;
    }

    /* allocating memory for a new string, and copies the old string
      into the new string*/

    int length2=strlen(jobs_adress);
    char * str2 = malloc(length2+1);
    strcpy(str2,jobs_adress);
    new_job->jobs_adress=str2;               

    new_job->pid = 1;
    new_job->creation_time = time(NULL);
    new_job->stop=false;
    new_job->foreground=true;

    free(new_job->jobs_adress);  // <=== the error is here

}
#包括
#包括
#包括
类型定义结构作业{
pid_t pid;
时间是创造的时间;
布尔停止;
布尔前景;
字符*工作地址;
}工作;
int main(){
char*jobs_address=“string”;
/*创建“作业”类型的对象*/
printf(“另一次尝试”);
Job*new_Job=(Job*)malloc(sizeof(new_Job));
如果(!新作业){
回来
}
/*为新字符串分配内存,并复制旧字符串
进入新的字符串*/
int length2=strlen(工作地址);
char*str2=malloc(长度2+1);
strcpy(str2,工作地址);
新建作业->作业地址=str2;
新建作业->pid=1;
新建作业->创建作业时间=时间(空);
新建作业->停止=错误;
新建作业->前台=true;
免费(新工作->工作地址);//
在这一行,
sizeof(new\u job)
正在测量变量
new\u job
的大小

new\u job
具有类型指针,指针(通常)为4字节。
所以分配4个字节

您打算为
作业
结构分配足够的空间。
这句话应该是:

Job * new_job = (Job*)malloc(sizeof(Job));

这整段代码看起来似乎让读者感到困惑…
sizeof(new\u job)
sizeof(job*)
。您是否打算编写
*new\u job
?您认为
sizeof(new\u job)
的值是多少?Ps您不会强制转换mallocalso
man strdup
sizeof(job)的返回值初始化作业*时,您只分配桌面上指针的大小(我的指针大小为4字节,在Visual Studio 32位上运行,取决于平台)。您可以说sizeof(*new_Job)或sizeof(Job),malloc不需要强制转换C。谢谢您!它现在可以工作了!您是一个救生员!
malloc(sizeof(*new_Job))
…这样,如果
new\u job
指向不同的类型,您的代码就不会出错。@ryker如果您在未强制转换
malloc
的结果时从C编译器收到警告,并且您肯定包含了
stdlib.h
,那么是的,这是编译器中的一个错误。但是如果您没有包含
stdlib.h
>然后警告告诉您需要修复该问题。(这就是为什么您不应该在C中强制转换
malloc
的结果:关于无效转换的警告可能是您收到的唯一通知,您忘记了包含
stdlib.h
,并且在ABI上,
void*
int
的大小不一样,这是一个灾难性的错误。)
Job * new_job = (Job*)malloc(sizeof(Job));