代码之家  ›  专栏  ›  技术社区  ›  klm_

C++指针

c++
  •  0
  • klm_  · 技术社区  · 14 年前

    你好 有人能解释为什么第二个 咳嗽 在func(char*p)中不起作用:

    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    using namespace std;
    
    char *strhex(char *str);
    char *func(char *p);
    
    int  main()
    {
         char *ptr;    
    
         char *p=strhex("d");
         cout<<"main:"<<p<<endl;
    
         cout<<func(p)<<endl;
    
         system("PAUSE");
         return 0;
    }
    
    char *func(char *p)
    { 
          cout<<"func1:"<<p<<endl;
          char buffer[500]="";
       char *zbuffer = buffer; 
          cout<<"func2:"<<p<<endl; ///doesn't work
    
          return zbuffer;
    }
    
    char *strhex(char *str)
    {
         char buffer[500]="";
      char *pbuffer = buffer;
      int len = strlen( str );
    
         for( int i = 0; i < len ;i++ )
      {
      itoa(str[i],pbuffer,16);  
            pbuffer +=2;
         };
    
         *pbuffer = '\0'; 
         pbuffer=buffer;
    
         return pbuffer;
    }
    

    编辑: 我在Windows上使用DEVC+4.4.92.2

    4 回复  |  直到 14 年前
        1
  •  4
  •   Oliver Charlesworth    14 年前

    这里的一个大问题是 strhex 正在返回指向局部变量的指针( buffer[] )这个变量在函数末尾超出范围,因此返回值指向可以随时覆盖的未定义内存内容。

        2
  •  1
  •   Chuck    14 年前

    您的整个代码不起作用。两个函数都返回指向本地数组的指针,而本地数组在函数返回后并不指向任何有效的对象。导致未定义的行为。因为价值 p 是这些无效指针中的一个,您不能依赖它在任何特定时间成为任何可能在 func() . 你也需要 new[] delete[] 适当的内存,或者最好使用一个合适的C++数据结构。 std::string .

        3
  •  0
  •   Mr. Mr.    14 年前

    它看起来工作正常,但是主目录中的第二个cout没有打印出一个值,因为您返回的是一个空缓冲区。

        4
  •  0
  •   codaddict    14 年前

    你不需要重置 pbuffer 指向数组的开头,然后返回其值:

    pbuffer=buffer;
    return pbuffer;
    

    你可以说

    return buffer;
    

    数组名也是一个指针(指向数组第一个元素的指针)。