C高手请进,关于传参。

来源:百度知道 编辑:UC知道 时间:2024/06/21 21:45:23
下面为什么不能输出"bbb"呢?

void abc(char **aaa) {
char bbb[3]="bbb";
*aaa = bbb;
}
void main() {
char *ccc;
abc(&ccc);
printf("%s",ccc);
}
谢谢,各位。
1.bbb不能设为全局。
2.bbb是通过业务逻辑得出来的。
当退出abc后,如何才能保存bbb的值给ccc?

虽然最终 ccc是指向字符串"bbb"(由char bbb[]="bbb"生成)的内存地址,但这个字符串是在栈里边的,随着函数的abc的返回,栈里相应内存里的数据已经改变,所以,输出来的内容就变了。

#include <stdio.h>

void abc(char **aaa)
{
char bbb[]="bbb";
*aaa = bbb;
printf("*aaa = %ld %s\n", *aaa, *aaa);
}

void main()
{
char *ccc;
abc(&ccc);
printf("ccc = %ld %s\n", ccc, ccc);
}

你运行一下这个程序就可以看出,虽然地址一样,但内容变了。

因为你那bbb是在栈上的, 函数退出就释放了

很显然啊 你的bbb申请的是3个字节的,而你的字符串"bbb"要占用4个字节

char bbb[4]="bbb";
void abc(char **aaa) {

*aaa = bbb;
}
void main() {
char *ccc;
abc(&ccc);
printf("%s",ccc);
}
这样就可以传了。 bbb在你写的函数体里面是个局部变量,函数结束就释放了,所以ccc得不到值,把它放外面,是全局变量,就可以了。

将char bbb 声明为static 或 全局

这样写

void abc(char **aaa) {
char *bbb="bbb";
*aaa = bbb;
}
void main() {