代码之家  ›  专栏  ›  技术社区  ›  Cosmos Man

在C中释放字符[]会产生错误,C编译器如何处理该字符[]

  •  -4
  • Cosmos Man  · 技术社区  · 7 年前

    虽然数组基本上是指针 char[] 在里面 C 给出一个错误。

    #include <stdlib.h>
    
    int main(void) {
        char ptr[] = "Hello World";
    
        free(ptr); // this gives error at run time
    }
    

    错误 :nexc(4212,0x10038e3c0)malloc: *对象0x7fff5fbff54c错误:未分配要释放的指针 * 在malloc\u error\u break中设置断点以进行调试

    有趣的是,它说我正在释放一个未分配的指针。
    这怎么会发生?

    但在 C++ ,编译器会给我一个编译时错误。

    int main(void) {
        char ptr[] = "Hello World";
    
        delete ptr; // this gives error at compile time
    }
    

    喜欢 Cannot delete expression of type char[12]

    我想这是因为编译器处理 char[12] 通过在调用函数时分配内存,并在函数结束时释放内存。所以,我在之后写了一些代码 free(ptr); 在函数结束之前。

    #include <stdlib.h>
    
    int main(void) {
        char ptr[] = "Hello World";
    
        free(ptr); // this still gives error at run time
    
        printf("\n");
        printf("\n");
        printf("\n");
        printf("\n");
        printf("\n");
    }
    

    这仍然会产生错误。这是怎么发生的?

    6 回复  |  直到 7 年前
        1
  •  4
  •   Some programmer dude    7 年前

    仅限您 free 使用分配的内容 malloc (直接或间接)或相关功能(如 realloc ).

    试图传递未返回的指针 马洛克 将导致 undefined behavior .

    您得到的编译器错误 delete 因为C和C++是 不同的语言 有不同的规则。

    记住,数组是数组,不是指针。虽然数组可以 衰退 在许多情况下(例如将其传递给函数时),指向其第一个元素的指针。

        2
  •  3
  •   Bathsheba    7 年前

    只有 呼叫 free 在…上 动态存储器 您已使用 malloc , calloc &c同样,你只需要打电话 delete 在分配给的内存上 new . 在您的情况下,C++编译器需要发出诊断,因为 指针衰减 不允许在此特定情况下发生,并且 删去 需要指针类型。

    尝试呼叫时的行为 自由的 打开自动存储器 未定义 .

        3
  •  1
  •   Yunnosch    7 年前

    你只需要释放malloced。
    你的 ptr 不是指针,而是数组;一个自动的局部(内部main())变量。它不需要释放,试图释放它是一个错误。

        4
  •  0
  •   Kram    7 年前

    所有静态字符串都将在数据段中分配。无法从此节中释放数据。在此之前,您只能释放已分配给malloc的数据(calloc/ralloc)

        5
  •  0
  •   sambia39    7 年前

    在C编程语言中,由于明显的原因,您无法编写所做的指令。首先,必须理解,指针变量与其他类型的变量一样,只是它只包含地址,所以它被称为指针变量,因为它包含内存中的地址。因此,指针是 与数据类型关联的地址 还有这些 这两个要素是不可分割的。

    如果指针变量包含整个类型的对象的地址,则使用指针对象了解如何解释构成该对象的位及其大小。因此,您编写的指令是指向存储在内存中某处的字符类型的常量指针。因此,字符串可能位于只读数据段中,因此您无法修改字符串或释放其内存,因为指针 变量不指向动态分配的空间中的字符串 通过“malloc”或“calloc”分配函数,这就是为什么会出现错误消息。

    第二个错误也是由于您在这里的角色混淆造成的,您必须理解字符数组和指针之间存在差异。简单地说,指针变量不是数组,数组也不是指针,但访问元素的方式是相同的。对于数组,组成字符串并以“\ 0”结尾的字符可以更改,但字符数组将始终指向内存中的同一地址,指针可以包含另一个地址,但请注意,如果使用指针分配内存,然后指向其他PAR,而不释放分配的内存,则会造成内存泄漏。

        6
  •  -2
  •   Dhruva-404    7 年前

    这是使用delete的正确方法!您首先必须使用new!让编译器知道变量ptr是动态的!

    #include<iostream>
    #include<new>
    using namespace std;
    
    int main(void) {
    
        char *ptr;
        try{
        ptr = new char [20];
        } catch(bad_alloc xa){
            cout<<"error";
        }
    
        ptr= "Hello World";
        cout<<ptr;
    
        delete [] ptr; 
    }