当前位置: 技术问答>linux和unix
函数参数传递方式的迷惑
来源: 互联网 发布时间:2017-05-15
本文导语: 话不多说,直接上代码: //文件1 #include #include void write_data(unsigned char *pckt_ptr){ pckt_ptr="i am a singer!"; } int main(void) { unsigned char pckt; write_data(&pckt); printf("%sn",&pckt); exit(0); } //文...
话不多说,直接上代码:
想要最后能够输出i am a singer!但是文件1的代码编译运行结果是乱码,而文件2能输出正确结果,百思不得其解,请解惑,谢谢~文件1应该如何修改?
//文件1
#include
#include
void write_data(unsigned char *pckt_ptr){
pckt_ptr="i am a singer!";
}
int main(void)
{
unsigned char pckt;
write_data(&pckt);
printf("%sn",&pckt);
exit(0);
}
//文件2
#include
#include
typedef struct ns_packet_t{
unsigned char *packet_data;
} ns_packet_t;
void write_data(ns_packet_t *pckt){
pckt->packet_data="i am a singer!";
}
int main(void)
{
ns_packet_t pckt;
write_data(&pckt);
printf("%sn",pckt.packet_data);
exit(0);
}
想要最后能够输出i am a singer!但是文件1的代码编译运行结果是乱码,而文件2能输出正确结果,百思不得其解,请解惑,谢谢~文件1应该如何修改?
|
由于由于形参改变,实参指针仍然没变化,再者你没有分配内存空间去存字符串呀。
void write_data(unsigned char **pckt_ptr){
*pckt_ptr=(unsigned char *)malloc(sizeof( "i am a singer!"));
memcpy(*pckt_ptr,"i am a singer!",sizeof( "i am a singer!"));
}
int main(void)
{
unsigned char *pckt;
write_data(&pckt);
printf("%sn",pckt);
free(pckt);
exit(0);
}
这样试试。
void write_data(unsigned char **pckt_ptr){
*pckt_ptr=(unsigned char *)malloc(sizeof( "i am a singer!"));
memcpy(*pckt_ptr,"i am a singer!",sizeof( "i am a singer!"));
}
int main(void)
{
unsigned char *pckt;
write_data(&pckt);
printf("%sn",pckt);
free(pckt);
exit(0);
}
这样试试。
|
文件1 定义的是一个unsigned char类型的变量pckt,你只能改变pckt的值,但是无法改变pckt的地址。而函数void write_data(unsigned char *pckt_ptr)的作用就是将“i am a singer!”的地址传给形参。c语言函数调用是参数值传递,而不是地址传递。你要想更改pckt的值应该是需要定义一个指针变量,然后让它指向堆空间里“i am a singer!”这样一个字符串的首地址。
|
看来楼主对指针的理解还不够深入啊,文件1修改为以下这样就可以了
1 #include
2
3 void write_data(unsigned char **ptr)
4 {
5 *ptr = "I am a singer!";
6 }
7
8 int main(int argc, char **argv)
9 {
10
11 unsigned char *ptr = NULL;
12
13 write_data(& ptr);
14 printf("%sn", ptr);
15
16 return 0;
17 }
楼主你的 write_data() 函数形参是一个指针变量,在函数中,你试图改变的是指针本身,而不是改变指针所指向的内存单元的内容,这样做没有任何意义,当然也不会对main函数的变量有任何影响,因为 write_data() 函数中的指针是一个副本而已
传指针和传值两种参数传递方式,本质上是一样的,都会在被调函数中产生副本,不一样的是副本的内容,有点绕吧,再给你一个例子吧
1 #include
2
3 void write_data(unsigned long i)
4 {
5 *((unsigned long *)i) = 100;
6 }
7
8 int main(int argc, char **argv)
9 {
10 unsigned long i = 0;
11
12 write_data((unsigned long)(&i));
13 printf("%ldn", i);
14
15 return 0;
16 }
1 #include
2
3 void write_data(unsigned char **ptr)
4 {
5 *ptr = "I am a singer!";
6 }
7
8 int main(int argc, char **argv)
9 {
10
11 unsigned char *ptr = NULL;
12
13 write_data(& ptr);
14 printf("%sn", ptr);
15
16 return 0;
17 }
楼主你的 write_data() 函数形参是一个指针变量,在函数中,你试图改变的是指针本身,而不是改变指针所指向的内存单元的内容,这样做没有任何意义,当然也不会对main函数的变量有任何影响,因为 write_data() 函数中的指针是一个副本而已
传指针和传值两种参数传递方式,本质上是一样的,都会在被调函数中产生副本,不一样的是副本的内容,有点绕吧,再给你一个例子吧
1 #include
2
3 void write_data(unsigned long i)
4 {
5 *((unsigned long *)i) = 100;
6 }
7
8 int main(int argc, char **argv)
9 {
10 unsigned long i = 0;
11
12 write_data((unsigned long)(&i));
13 printf("%ldn", i);
14
15 return 0;
16 }
|
学习指针就要多画画内存示意图,调试时多查看指针变量的值与内存中的内容,做几遍下来对指针的理解就会加深很多了
我当初学汇编用汇编共2年时间,对直接、间接寻址的认识还算熟悉,所以C/C++指针理解起来也容易
我当初学汇编用汇编共2年时间,对直接、间接寻址的认识还算熟悉,所以C/C++指针理解起来也容易
|
char *str;可以对str=“I am a singer”这样直接赋值?