在C中释放字符串时出现分段错误
当我试图释放从“new_job->jobs_address”指向的字符串的分配内存时,出现了“segmentation fault”错误。我已经为我的字符串分配了足够的内存(即使我分配的内存远远超出了我的需要,我仍然有这个问题),但是仍然存在这个错误在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
#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您不会强制转换mallocalsoman 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));