当前位置:  技术问答>linux和unix

指针 函数 专家请进

    来源: 互联网  发布时间:2016-10-27

    本文导语:    一个同学问到的发现自己也有点模糊不清,返回结果是前面为随机值,后面可以打印,用gdb调试发现在打印的时候有问题,返回到ret都是有值的,请大家能够解答,另附汇编。   1 #include    2    3 char *mytest(){...

  一个同学问到的发现自己也有点模糊不清,返回结果是前面为随机值,后面可以打印,用gdb调试发现在打印的时候有问题,返回到ret都是有值的,请大家能够解答,另附汇编。
 
 1 #include 
  2 
  3 char *mytest(){ char str[]="qwer";  return str;}
  4 
  5 char *mytest1(){char *str="qwer";   return str;}
  6 int main(void)
  7 {
  8     char *ret;
  9     ret = mytest();
 10     printf("string=%sn",ret);
 11     ret = mytest1();
 12     printf("string=%sn",ret);
 13     return 1;
 14 }


 
 1     .file   "main.c"
  2     .text
  3 .globl mytest
  4     .type   mytest, @function
  5 mytest:
  6     pushl   %ebp
  7     movl    %esp, %ebp
  8     subl    $16, %esp
  9     movl    $1919252337, -5(%ebp)
 10     movb    $0, -1(%ebp)
 11     leal    -5(%ebp), %eax
 12     leave
 13     ret
 14     .size   mytest, .-mytest
 15     .section    .rodata
 16 .LC0:
 17     .string "qwer"
 18     .text
 19 .globl mytest1
 20     .type   mytest1, @function
 21 mytest1:
 22     pushl   %ebp
 23     movl    %esp, %ebp
 24     subl    $16, %esp
 25     movl    $.LC0, -4(%ebp)
 26     movl    -4(%ebp), %eax
 27     leave
 28     ret
 29     .size   mytest1, .-mytest1
 30     .section    .rodata
 31 .LC1:
 32     .string "string=%sn"
 33     .text
 34 .globl main
 35     .type   main, @function
 36 main:
 37     pushl   %ebp
 38     movl    %esp, %ebp
 39     andl    $-16, %esp
 40     subl    $32, %esp
 41     call    mytest
 42     movl    %eax, 28(%esp)
 43     movl    $.LC1, %eax
 44     movl    28(%esp), %edx
 45     movl    %edx, 4(%esp)
 46     movl    %eax, (%esp)
 47     call    printf
 48     call    mytest1
 49     movl    %eax, 28(%esp)
 50     movl    $.LC1, %eax
 51     movl    28(%esp), %edx
 52     movl    %edx, 4(%esp)
 53     movl    %eax, (%esp)
 54     call    printf
 55     movl    $1, %eax
 56     leave
 57     ret
 58     .size   main, .-main
 59     .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
 60     .section    .note.GNU-stack,"",@progbits



|
char *mytest(){ char str[]="qwer";  return str;}
--这种是错误的,str是一个局部变量,函数返回时空间释放,因此地址不再有效,输出内容是随机的。

char *mytest1(){char *str="qwer";   return str;}
这种是正确的,str是一个指针,指向存放于常量区的"qwer",这个地址在整个程序的生命周期都是有效的。

|
 46     movl    %eax, (%esp)    ///应该这个会覆盖才对吧,这时的esp应该和前面的-5(%ebp)的地址是交叉的。。。printf里面也可能再次覆盖的 
 47     call    printf

    
 
 

您可能感兴趣的文章:

  • 深入解析函数指针与返回函数的指针
  • 指向类成员函数的指针其实并非指针
  • 请问如何根据函数指针打印出这个函数的名称?
  • c++函数指针和回调函数示例
  • 利用函数指针的好处是什么?
  • JAVA中函数调用时,能不能向 C/C++一样函数的入口参数可以为传出值(就是引用,或指针)
  • C:函数指针
  • 一般函数指针和类的成员函数指针深入解析
  • 一个线程函数如何取得GTK界面的所有控件指针?
  • 函数指针的一些概念详解
  • 系统函数返回的指针指向的内存释放的问题
  • sp->callback或snmp_callback函数指针在哪里赋值?
  • 函数指针的强制类型转换实现代码
  • 函数指针的问题
  • 有些系统函数返回一个数据指针,实际的内存占用空间应该在那里??
  • C#委托所蕴含的函数指针概念详细解析
  • C++中返回指向函数的指针示例
  • c/c++ iis7站长之家
  • C++普通函数指针与成员函数指针实例解析
  • 关于linux下多线程运行由同一函数指针传入不同函数体的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • gcc编译CORBA程序如何关闭智能指针转换为普通指针的警告
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 谁说java没指针,我觉得全是指针才对
  • 深入解析C++中的指针数组与指向指针的指针
  • 一个用指针传递内存的问题(如果传进去的是三重指针确不行)
  • busybox中的gzip运行过程中出现page fault错误,并指出出错的指针,但是怎么使用gdb调试,找到指针对应的语句?
  • 关于free指针的指针分量
  • C语言中常量指针与指针常量区别浅析
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • C++中指向对象的常指针与指向常对象的指针详解
  • 关于指针变量,struct 变量,指针使用的一些疑惑,望高手指教
  • 深入理解数组指针与指针数组的区别
  • 指向变量的常指针与指向常变量的指针详细解析
  • 结构指针类型强制转换
  • 请问如何在linux (redhat)下传递一维数组指针?
  • 野指针问题
  • 关于指针的地址重的问题,求教了。
  • 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)
  • 数组指针、指针数组以及二位数组的深入解析
  • 大家讨论一下指针数组的问题!


  • 站内导航:


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

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3