c - 如何释放C中的内存

标签 c pointers memory

我正在编写一个 C 程序,但我遇到了一些内存错误,所以我决定编写一个小程序来查看何时以及如何释放内存。

我的例子:

int main() {
    char *a=malloc(5);
    a="mama";
    char *b=malloc(strlen(a));
    printf("%s\n",a);
    strcpy(b,a);
    free(a);
    printf("%s\n",b);
    return 0;

这里我遇到了一个错误:

* Error in `./a': free(): invalid pointer: 0x0000000000400757 *

但是当我只改变一行时:

int main() {
    char *a=malloc(5);
    strcpy(a,"mama");
    char *b=malloc(strlen(a));
    printf("%s\n",a);
    strcpy(b,a);
    free(a);
    printf("%s\n",b);
    return 0;

我的第二个程序运行良好,那么为什么我在第一个程序中遇到此错误? 我希望你能解释一下原因。

在我的真实程序中,我是这样做的:

    char * getDate(){

    char *date=malloc(5);
    //some instructions here
    return date;
}


int main() {
    char *a=malloc(5);//im sure that a will not exceed 5 bytes
    a=getDate();
    return 0;
}

这只是一个小例子,我不知道在哪里释放内存。所以我如何以及在哪里可以释放内存,我要释放日期还是 char 指针?

第二次编辑:

void getDate(char *a){
        //some instructions here
    strcpy(a,"haha");

}
int main() {
        char *a=malloc(5);
            getDate(a);
            int i= strlen(a);
            printf("%s and the size is :%d\n",a,i);
            free(a);
            return 0;
 }

为了避免内存错误,我必须遵守哪些规则。

非常感谢。

最佳答案

行内:

char *a=malloc(5);

您为 a 分配动态分配的内存块的地址,但随后在该行中:

a="mama";

重新分配它为文字字符串常量"mama" 的地址。丢弃指向动态分配 block 的指针,以便在调用时

free(a);

a 不再是有效的堆内存块,无法释放。

C 中的字符串(和一般的数组)不是数据一级类型,不能赋值。你应该替换:

a="mama";

strcpy( a, "mama" ) ;

赋值设置指针值 - 它不会“mama”复制到a指向的内存。另一方面,strcpy() 调用将字符串复制到由 a 引用 的动态内存块。

在您的第二个代码片段中,您正在“泄漏”在 main() 中分配的内存,因为您在没有释放原始 block 的情况下重新分配了 a。尽管在您的示例中您没有释放 a,但它仍然可以释放,因为 GetDate() 中的分配是动态的。作为一种编码风格,在函数中动态分配内存并返回它的指针是一个坏主意,因为它使调用者有责任知道内存是动态分配的并且必须被释放,并且它会引起内存泄漏。

关于c - 如何释放C中的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36248479/

相关文章:

c - 如何将项目动态添加到动态数组

c - 我不了解C字符串

Java JNA 包装器和内存消耗

javascript - 网站在 IE 中崩溃,可能是内存泄漏?

c - C 中奇怪的 int 输出

C:在 if 条件下调用 close()

c - 指针和双指针练习

C 指针 : pointing to an array of fixed size

java - 将 Java 对象实例化为传递的对象引用

c++ - 链表语法 : is "next" already defined?