无法将指针作为参数传递给另一个函数

时间:2014-08-04 09:26:59

标签: c++ pointers

我想使用指针来存储由函数生成的char数组,然后将其作为参数传递给另一个函数,代码如下所示:

char* randString(){
    //generate a rand string formed by 6 letters and numbers
    char rSet[36];//a char set contains 0-9 and A-Z
    for (int i=0;i<10;i++) rSet[i]=i+48;// get ASCII of 0-9
    for (int i=10;i<36;i++) rSet[i]=i+55;// get ASCII of A-Z

    char rString[7];
    for (int i=0;i<6;i++){
        int ind=rand()%36;
        rString[i]=rSet[ind];// generate the random string
    }
    rString[6]='\0';
    return rString;
 }
void Print(char *b){
    cout<<b;
}
int main(int argc, char* argv[])
{
    char* a=randString();
    Print(a);
}

randString()函数返回一个由6个随机字母和数字组成的字符串,然后用* a存储它。当我用调试跟踪指针时,我发现* a的内容是正确的,有些东西比如“VG5GH2”。但是,当它传递给Print()函数时,指针的内容丢失了。即使内存地址仍然相同,其中的值也会变成一些完全随机的东西。如果我做Print(randString())也会发生同样的事情。有人可以帮我解决这个问题吗?我对C ++很陌生,但使用指针仍然不是很清楚。非常感谢

3 个答案:

答案 0 :(得分:2)

创建字符数组时,它是在本地范围内创建的,不能在您创建它的函数之外使用。要解决此问题,您可以在同一代码中执行的最佳方法是在堆上创建字符数组。这将为您提供您想要获得的确切结果。

char *rString;
rString = new char[6];

最后,应该删除在堆上创建的变量!你可以通过删除你从函数

接收字符串的字符指针来完成它
char* randString();

作为

delete []a; 

在你的课程结束时。

答案 1 :(得分:1)

内存问题伙伴你只是发回你的随机字符串的第一个字符,其他人在功能完成它的工作时被销毁。但是如果你用'new'关键字创建它们你没有任何问题做你想做的任何事情。我希望这会帮助

char* randString(){
    //generate a rand string formed by 6 letters and numbers
    char rSet[36];//a char set contains 0-9 and A-Z
    for (int i=0;i<10;i++) rSet[i]=i+48;// get ASCII of 0-9
    for (int i=10;i<36;i++) rSet[i]=i+55;// get ASCII of A-Z
    srand(time(nullptr));

    char *rString=new char[7];
    for (int i=0;i<6;i++){
        int ind=rand()%36;
        rString[i]=rSet[ind];// generate the random string
    }
    rString[6]='\0';
    return rString;
}
void Print(char *b){
     cout<<b;
}

int main()
{
     char *a=randString();
     Print(a);
     delete[] a;
     return 0;
}

答案 2 :(得分:0)

您正在返回指向函数内部局部变量的指针。您正在引用堆栈内存 - 一旦方法/函数退出,它将被其他函数,变量使用。

这里的答案之一提及&#34;悬挂指针&#34;。该术语仅适用于malloc()然后free()并重新使用指针;

int *i = (int *) malloc(sizeof(int));
*i = 12;
free(i); // oops
printf("i = %d\n", *i);

如果要编写返回字符串(char*)的函数,则有两个选项:

  1. 在函数内分配内存然后将其返回
  2. 作为参数之一,您需要获取输出缓冲区和输出缓冲区大小。
  3. 正如您在C ++中编码一样 - 在任何地方使用std::string,并且根本不使用char* (注意自我 - 仍然在输出上有一个内存复制...也许传递std :: string out参数作为参考将有助于......?)

  4. 示例1,注意我们如何调用该函数然后释放内存。内存管理由该功能完成。这不是最佳选择,我不建议这样做。

    // in this function, the caller must release the memory
    char* randStr1(int len) {
       char* c = (char*) malloc(len), *cc = c;
       for (int i=0; i<len; i++) {
             *cc = rand()l
             *cc++;
       }
       return c;
    }
    
    void foo1() {
       char *c = randStr1(10);
       printf("%s", c);
       free(c);
    }
    

    示例2:在此示例中,内存分配由调用者

    完成
    char* randStr2(char *buffer, uint len) {
        char *c = buffer;
        while (len!=0) {
            *c = rand();
            c++;
            len --;
        }
        return buffer;
    }
    
    void bar1() {
       char buffer[100], *p;
       p = randStr2(buffer, 100);
       printf("%s", buffer); // or printf("%s", p);
    }
    

    请注意,在上一个示例中,我们不需要从堆中取消分配内存。编译器将从堆栈中分配和取消分配内存。