函数返回多个返回值的问题

love603 2008-12-21 04:20:36
小弟初学C语言不久,写了下面段程序:
#include <iostream>
#include <stdlib.h>


typedef struct ll {
char* name;
int size;
}lnk;

int pp(lnk *test) {
lnk* temp = (lnk*)malloc(sizeof(lnk));
temp->name = "d";
temp->size = 1;
test = temp;
return 0;
}

int main() {
lnk* tt = NULL;
pp(tt);
std::cout << tt->name << std::endl;

return 0;
}

愿意是想通过PP函数改变tt指针的指向,但是该程序是有问题的,pp并没有改变tt指针的值。我pp函数的原来意图是想在里面建立一个链表(上面的程序简化了链表部分),然后通过test返回的,考虑到要返回多个值,只能通过指针来作为形参了。我不知道我上面的程序怎么改?请教各位高手。
...全文
171 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
meixqhi 2008-12-26
  • 打赏
  • 举报
回复
送你以句良言,出现问题多自己动动脑子,这对以后自己的独立思考很有帮助。
meixqhi 2008-12-26
  • 打赏
  • 举报
回复
送你以句良言,出现问题多自己动动脑子,这对以后自己的独立思考很有帮助。
chinazjf 2008-12-23
  • 打赏
  • 举报
回复
写成这样:
#include <iostream>
#include <stdlib.h>


typedef struct ll {
char* name;
int size;
}lnk;

int pp(lnk **test) {
lnk* temp = (lnk*)malloc(sizeof(lnk));
temp->name = "d";
temp->size = 1;
*test = temp;
return 0;
}

int main() {
lnk* tt = NULL;
pp(&tt);
std::cout < < tt->name < < std::endl;

return 0;
}

你的问题是:
你传入的是test形参(就是说进入函数前在栈里创建了tt的备份,函数里操作并不是外面的tt),函数里不能改变形参的值,要想改变需要把tt的地址传入,tt本来是指针,所以传进去的就是指针的指针了。函数里*test就是外面的tt指针变量,对*test的操作就是对tt的操作。
希望对你理解形参和实参有帮助。
chinazjf 2008-12-23
  • 打赏
  • 举报
回复
c语言好像不能这样写
bitwwzhang130 2008-12-21
  • 打赏
  • 举报
回复
1楼正解
codejian 2008-12-21
  • 打赏
  • 举报
回复
抄写了LS的老大们的代码,

#include <iostream>
#include <string>
using namespace std;

struct lnk
{
std::string name;
int size;
};

int pp(lnk &test)
{

test.name = "d";
test.size = 1;

return 0;
}

int main()
{
lnk tt;
pp(tt);
std::cout<<tt.name<<std::endl;
return 0;
}

nullah 2008-12-21
  • 打赏
  • 举报
回复
upup
lann64 2008-12-21
  • 打赏
  • 举报
回复
既然c++,用c++的类型和引用会更方便
#include <iostream>
#include <string>

struct lnk
{
std::string name;
int size;
};

int pp(lnk &test)
{

test.name = "d";
test.size = 1;

return 0;
}

int main()
{
lnk tt;;
pp(tt);
std::cout << tt.name << std::endl;

return 0;
}
P_ghost 2008-12-21
  • 打赏
  • 举报
回复
这样的代码楼主可以杀掉了,重新设计吧!
lbh2001 2008-12-21
  • 打赏
  • 举报
回复
参数的传递理解不正确

#include <iostream>
#include <cstdlib> //不要使用"stdlib.h"格式

using namespace std;

typedef struct ll
{
char* name;
int size;
}lnk;

int pp1(lnk *&test) //指针的引用
{
lnk* temp = (lnk*)malloc(sizeof(lnk));
temp->name = "d";
temp->size = 1;
test = temp;

return 0;
}

int pp2(lnk *&test) //指针的引用
{
lnk* temp = (lnk*)malloc(sizeof(lnk));
temp->name = "d";
temp->size = 1;
test = temp;

return 0;
}

int main(void)
{
lnk* tt = NULL;

pp1(tt); //指针的副本,不影响实际参数,改为二级指针
std::cout << tt->name << std::endl;

tt = NULL;
pp2(tt); //指针的副本,不影响实际参数,改为指针的引用
std::cout << tt->name << std::endl;

return 0;
}

太乙 2008-12-21
  • 打赏
  • 举报
回复
lz也可以把tt的内存分配工作放到main里,这样 就可以了!
#include <iostream> 
#include <stdlib.h>


typedef struct ll {
char* name;
int size;
}lnk;

int pp(lnk *test) {

test ->name = "d";
test ->size = 1;
return 0;
}

int main() {
lnk* tt = (lnk*)malloc(sizeof(lnk));
pp(tt);
std::cout < < tt->name < < std::endl;

return 0;
}
ypb362148418 2008-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hhyttppd 的回复:]
nt pp(lnk*&test)
[/Quote]


//支持
kingteng 2008-12-21
  • 打赏
  • 举报
回复
#include <iostream> 
#include <stdlib.h>


typedef struct ll {
char* name;
int size;
}lnk;

int pp(lnk **test) {
lnk* temp = (lnk*)malloc(sizeof(lnk));
char* s = "d";
temp->name = s;
temp->size = 1;
*test = temp;


return 0;
}

int main() {
lnk* tt = NULL;
pp(&tt);
std::cout << tt->name << std::endl;

return 0;
}
yellowhwb 2008-12-21
  • 打赏
  • 举报
回复

#include <iostream>
#include <stdlib.h>


typedef struct ll {
char name; //这里不要用char*,否则你就要注意释放char*的内存了
int size;
}lnk;

int pp(lnk **test) { //用二级指针
lnk* temp = (lnk*)malloc(sizeof(lnk));
temp->name = 'd';
temp->size = 1;
*test = temp;
return 0;
}

int main() {
lnk* tt = NULL;
pp(&tt);
std::cout << tt->name << std::endl;

return 0;
}
xiaoyisnail 2008-12-21
  • 打赏
  • 举报
回复
1楼正解,要传递指针的引用才能修改这个指针本身的值,不然只能修改这个指针指向的对象
hhyttppd 2008-12-21
  • 打赏
  • 举报
回复
nt pp(lnk*&test)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧