我想使用指针来存储由函数生成的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 ++很陌生,但使用指针仍然不是很清楚。非常感谢
答案 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*
)的函数,则有两个选项:
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);
}
请注意,在上一个示例中,我们不需要从堆中取消分配内存。编译器将从堆栈中分配和取消分配内存。