使用c中的free()进行分段错误

时间:2016-09-08 13:55:10

标签: c memory segmentation-fault free

我试图通过一些C代码找到问题。调试器说当我尝试从指针释放mem时发生错误:

int main(int argc, char *argv[]){   
    char *desc = malloc(30 * sizeof(char));
    if(desc == NULL)                    
    {
        fprintf(stderr, "Error - cannot allocate memory\n");
    }
    desc = "Debug this program.";
    printf("Description: %s\n", desc);
    free(desc);//break point here
    int cpid = fork();
    ....

4 个答案:

答案 0 :(得分:6)

你重新分配了 WebElement e = driver.findElement(By.cssSelector(".info a")); String href = e.getAttribute("href"); driver.get(href); or driver.navigate().to(href); ,然后释放了一个指向字符串文字的指针,这是非法的,它会导致分段错误。

您显然无法理解desc的用途,malloc()从操作系统请求内存并返回指向您可以在程序中使用的有效内存的指针。

在您malloc()之后,您可以使用内存,但并非所有指针都需要我malloc()。例如,您可以指向字符串文字,它们也很有用。

但是,除非malloc() / free() / malloc()返回,否则您无法将任何内容传递给calloc()。指向字符串文字或保存变量地址的指针不是这样的指针,并将其传递给realloc()是未定义的行为。

如果您知道必须使用free(),例如分配大量可能会溢出堆栈的内存,或者分配您可以在运行时计算的未知内存量。否则,不要。

答案 1 :(得分:3)

首先,您分配了动态内存及其分配给指针desc

的地址
char *desc = malloc(30 * sizeof(char));

然后使用字符串文字"Debug this program."的第一个字符的地址重新指定指针

desc = "Debug this program.";

因此,分配的内存的地址丢失了。

然后你试图释放字符串文字占用的内存

free(desc);//break point here

但是,字符串文字具有静态存储持续时间,并且无法使用标准函数free释放。

而不是这个赋值语句

desc = "Debug this program.";

您应该使用标准C函数strcpy,例如

strcpy( desc, "Debug this program." );

答案 2 :(得分:1)

您正试图释放文字字符串的地址,这是非法的。

使用您可以使用的文字字符串初始化malloc字符串,例如strcpy

strcpy(desc, "Debug this program.");

如果malloc失败,您还应该退出/终止您的程序。

答案 3 :(得分:-1)

简单地说(并阅读其他解决方案),该内存不属于您的删除。