不能将指针作为参数传递给另一个函数
Can not pass pointer as a parameter to another function
我想使用指针来存储由函数生成的字符数组,然后将其作为参数传递给另一个函数,代码看起来像这样:
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*
),你有两个选择:
- 在函数内部分配内存,然后返回它
- 作为参数之一,需要获取输出缓冲区,以及输出缓冲区的大小。
- 当你在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);
}
请注意,在最后一个示例中,我们不需要从堆中取消内存分配。编译器将从堆栈中分配和取消分配内存。
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 将 N-arg 函数包装到另一个函数中
- C++从另一个函数退出函数
- 视觉我希望一个函数在另一个函数C++中进行计算
- 在另一个函数 (c++) 中调用变量
- 如何在另一个函数中使用返回值作为参数?
- 如何包装一个函数以适应另一个函数的所需类型
- 当使用我在一个函数、另一个函数中修改的数组时,在我的输出中得到一个奇怪的负数
- 如何将 lambda 函数作为参数发送到另一个函数
- 将可变参数从一个函数传递到另一个函数
- 有没有办法在另一个函数中加入线程?(即超出其自身范围)
- 存储另一个函数返回的布尔数组时遇到问题
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 将作业传递给另一个函数,而不会延迟 arduino
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 将参数从一个函数传递到另一个函数(没有模板) - C++
- 如何利用指针从一个函数到另一个函数?
- 使用另一个函数调用一个函数(都在类中)时出现问题.没有错误代码C++
- 在 c++ 中,如何将当前函数的所有参数传递给另一个函数?