C++ 指针故障(C+;+;)

C++ 指针故障(C+;+;),c++,pointers,memory,memory-address,C++,Pointers,Memory,Memory Address,可能重复: char*strdup(const char*s) { char dup[strlen(s)]; for(int i=0;ichar dup[strlen(s)]定义了一个本地堆栈变量;当函数结束时,这超出了范围,因此在此之后尝试访问它将导致未定义的行为 你的选择是: 使用堆变量(使用new获得)。您必须记住在某个时候删除它 让函数写入调用者提供的现有缓冲区(例如,void strdup(char*out,const char*in)) 使用C++构造,为你做所有的辛勤工作。 由于

可能重复:

char*strdup(const char*s)
{
char dup[strlen(s)];
for(int i=0;i
char dup[strlen(s)]
定义了一个本地堆栈变量;当函数结束时,这超出了范围,因此在此之后尝试访问它将导致未定义的行为

你的选择是:

  • 使用堆变量(使用
    new
    获得)。您必须记住在某个时候删除它
  • 让函数写入调用者提供的现有缓冲区(例如,
    void strdup(char*out,const char*in)
  • 使用C++构造,为你做所有的辛勤工作。

  • 由于您已将问题标记为“C++”,我强烈推荐选项#3。

    dup
    变量是
    char
    的数组,分配给堆栈而不是堆(通过
    new
    malloc
    )这是未定义的内存,很快将被其他内容覆盖


    您需要将
    dup
    转换为
    char*
    ,并使用
    new
    malloc
    来分配必要的内存。

    问题是您从未在堆上分配dup,因此当您退出堆栈帧时,dup将与堆栈帧一起自动删除。这意味着不可能有有效的内存对dup的引用,因为一旦退出该函数,dup就不再存在。

    这应该可以:

    char* strdup(const char* s)
    {
        char* dup = new char[strlen(s)];
        for (int i = 0; i<strlen(s); i++)
        {
            dup[i]=s[i];
        }
        return dup;
    }
    
    char*strdup(const char*s)
    {
    char*dup=新字符[strlen];
    
    对于(int i=0;i您不能返回dup[],因为它是一个局部变量,在函数外部无效(它指向的内存将不再有效)。您必须调用malloc()之类的函数,它在堆上分配内存(所有应用程序都可以看到的空间)

    您的定义指定了一个字符数组指针作为其返回类型,但您在函数中初始化了一个字符数组并尝试返回它。请尝试以下操作:

    char* strdup(const char* s)
    {
        char *dup = new char[strlen(s)];
        for (int i = 0; i<strlen(s); i++)
        {
            dup[i]=s[i];
        }
        return dup;
    
    char*strdup(const char*s)
    {
    char*dup=新字符[strlen];
    对于(int i=0;i
    char*strdup(const char*s)
    {
    char dup[strlen(s)];//在*堆栈上定义*局部*变量*
    对于(inti=0;i

    char dup[strlen(s)];
    

    将不在C++中工作。数组需要在编译时指定的常数大小;StLLN(s)是变量。< /P>


    就您的实际警告而言,向调用者返回指向局部变量的指针是一种不好的做法;因为局部变量(在本例中为数组dup)是在堆栈上分配的,当函数返回时,它被解除分配,因此,返回的指针可能无效。编译器旨在捕获此类错误并标记警告,指出这可能是问题的潜在根源。

    典型的设计是将目标地址作为参数。这克服了b中提到的问题eLOWBWARE。您的代码似乎工作正常,您可能会忽略编译器警告。但是,您的代码中有一个主要缺陷,它将剧烈爆炸。另外,
    strdup
    是保留的(以及所有其他以
    str
    开头的名称)因此,即使当你修复内存分配问题时,代码仍然会失败。因为你已经把它标记为C++,你几乎应该肯定只使用<代码> STD::String 。拼写。指针。啊,你确实是对的,谢谢你指出:)这不仅仅是不好的做法和“潜在的问题源”,它是完全未定义的行为!如果在一个非平凡的程序中使用,很可能会崩溃和烧毁。
    char* strdup(const char* s)
    {
        char dup[strlen(s)]; // defines *local* variable on *stack*
        for (int i = 0; i<strlen(s); i++)
        {
            dup[i]=s[i];
        }
        return dup; // returning dup[0] = dup address
    }
    
    char dup[strlen(s)];