当前位置:  技术问答>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); } //文...

话不多说,直接上代码:

//文件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);
}

这样试试。

|
文件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 }


|
学习指针就要多画画内存示意图,调试时多查看指针变量的值与内存中的内容,做几遍下来对指针的理解就会加深很多了
我当初学汇编用汇编共2年时间,对直接、间接寻址的认识还算熟悉,所以C/C++指针理解起来也容易

|
char *str;可以对str=“I am a singer”这样直接赋值?

    
 
 

您可能感兴趣的文章:

  • 对信号处理函数的迷惑!
  • 关于accept函数的一点迷惑!
  • probe函数参数传递过程?
  • gtk 回调函数的参数传递问题!
  • 一个消息处理函数参数传递的问题
  • java的基本型数据,比如int,char在函数参数中能否“按址传递”
  • 函数传递数字
  • 关于write函数的第三个参数的传递
  • linux驱动中probe函数中参数传递问题?
  • C# 使用匿名函数解决EventHandler参数传递的难题
  • 高手请进:请问用response.sendRedirect()函数传递的中文参数如何正确识别?
  • c#.net 匿名函数进行EventHandler参数传递的问题
  • main函数传递浮点型参数问题
  • Python def函数的定义、使用及参数传递实现代码
  • 浅析c/c++中函数的参数传递
  • C++ STL Bitsets构造函数及成员函数解释及代码示例 iis7站长之家
  • python进阶教程之函数参数的多种传递方法
  • C++指针作为函数的参数进行传递时需要注意的一些问题
  • 函数调用参数传递的问题
  • 用sigqueue()函数向另一个进程传递一个指针
  • jQuery防止click双击多次提交及传递动态函数或多参数
  • python下函数参数的传递(参数带星号的说明)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Maps 成员 key_comp():返回比较元素key的函数
  • 请问:定义了2个函数,其中第一个函数要访问另外一个函数的变量,怎么处理阿?谢谢
  • C++ Maps 成员 value_comp():返回比较元素value的函数
  • 如果知道一个函数的地址或函数名,如何得到函数所在的文件名?
  • C++ MultiMaps 成员 key_comp():返回比较key的函数
  • java的数学函数在那个类中,如幂函数、指数、对数、双曲线函数等?
  • C++ MultiMaps 成员 value_comp():返回比较元素value的函数
  • 一个父类的构造函数的参数是(Applet applet),请问它的子类构造函数当中应怎样调用父类构造函数?
  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • 虚函数被类的构造析构函数和成员函数调用虚函数的执行过程
  • C++ Strings(字符串) 成员 Constructors:构造函数,用于字符串初始化
  • 在内核的某个函数中,如何能知道是哪个用户空间的函数调用了它,以及这个用户空间函数所在的文件?
  • linux c 生成随机数srand函数和rand函数介绍及代码示例
  • 在dos下访问内存的MK_FP函数在linux下对应什么函数?int86()函数呢?
  • Linux下gettimeofday()函数和clock()函数:精确到毫秒级的时间
  • 一个静态库包含多个函数,应用程序连接了库中的某个函数,应用程序目标代码中是否还包含了该静态库中的其他函数代码?
  • Linux c++虚函数(virtual function)简单用法示例代码
  • Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • js的众多函数令小弟实在搞不清楚!哪有函数速查手册之类的软件或者书籍!谢了!比如,setInterval、clearInterval这两个函数是干什么的?
  • cityhash 32位,64位和128位介绍及函数列表
  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,