帮忙看一下这个关于C语言结构体的一个疑问!

#include<stdio.h>
struct info
{
int k;
char*s;
}t;
void f(struct info t)
{
t.k=1997;
t.s="Borland";
}
void main()
{
t.k=2000;
t.s="Inprise";
f(t);
printf("%d,%s\n",t.k,t.s);
}
用VC6.0编译后,结果是2000,Inprise
请问这是为什么呢?难道那个函数调用一点用都没有?
Press any key to continue



犯罪嫌疑人X
浏览 268回答 3
3回答

慕标琳琳

你的函数调用是采用值传递的方式,也就是在f函数中另外生成一个结构体,你改变的是这个新生成的结构体的值,main中的结构体t的值不变。可改用地址传递的方式:#include<stdio.h>struct info{int k;char*s;}t;void f(struct info *t){t->k=1997;t->s="Borland";}void main(){t.k=2000;t.s="Inprise";f(&t);printf("%d,%s\n",t.k,t.s);}

沧海一幻觉

一个或多个其他数据类型组成。那个sin_family,sin_port ,sin_addr都是结构体sockaddr_in的一部分,既然整个结构体都传进去了,那么他的每部分自然都被传递。函数的参数可以是任何数据类型,自然也能是结构体比如说你bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))那么在bind函数里用my_addr->sin_port就能得到他的端口,my_addr->sin_addr就能得到他的地址。

呼唤远方

将地址传入才会有变化,传结构体在函数中只有传入参数的副本,修改的也只是其副本,建议F9下断点,单步运行调试看看memory就知道了。可修改如下:#include<stdio.h>struct info{int k;char*s;}t;void f(struct info* t){t->k=1997;t->s="Borland";}void main(){t.k=2000;t.s="Inprise";f(&t);printf("%d,%s\n",t.k,t.s);}
打开App,查看更多内容
随时随地看视频慕课网APP