不能将指针作为参数传递给另一个函数

Can not pass pointer as a parameter to another function

本文关键字:另一个 函数 参数传递 指针 不能      更新时间:2023-10-16

我想使用指针来存储由函数生成的字符数组,然后将其作为参数传递给另一个函数,代码看起来像这样:

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]='';
    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++的新手,对指针的使用还不是很清楚。Many thanks

当你创建字符数组时,它是在局部范围内创建的,不能在你创建它的函数之外使用。要解决这个问题,在相同的代码中,最好的方法是在堆上创建字符数组。这将给你你想要得到的确切结果。

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

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

中接收字符串的char指针来实现
char* randString();

delete []a; 

内存问题,你只是发送回你的随机字符串的第一个字符,当函数完成它的工作时,其他销毁。但是如果你用"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]='';
    return rString;
}
void Print(char *b){
     cout<<b;
}
int main()
{
     char *a=randString();
     Print(a);
     delete[] a;
     return 0;
}

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

这里的一个答案提到了"悬空指针"。该术语仅适用于malloc()free(),并重新使用指针;

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

如果你想写返回字符串的函数(char*),你有两个选择:

  1. 在函数内部分配内存,然后返回它
  2. 作为参数之一,需要获取输出缓冲区,以及输出缓冲区的大小。
  3. 当你在c++中编码时-到处使用std::string,并且根本不使用char* (注意到自我-仍然在输出上有一个内存副本…也许传递std::string out参数作为参考会有所帮助…?)

例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);
}

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