| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 787 人关注过本帖
标题:请教一下大家
只看楼主 加入收藏
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:0 
回复 10楼 lz1091914999
我支持九楼

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-08-27 23:36
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 11楼 A13433758072
开始我怕麻烦所以没有好好解释,现在我争取到一些上网的时间就解释一下吧:
这是楼主写的代码:
char * GetStr(char *p)
{
   p="hello world";
    return p;
}

void main()
{
    char *str=NULL;
    if(NULL!=GetStr(str))
     {
      printf("\r\n str=%s",str);
    }
   return;
}
可以看到在GetStr中"hello world"的首地址是成功返回的,但这并没有影响到main里的str,因为GetStr的参数p只是接收到了str的值,因为在调用GetStr之前有这一段:
char *str=NULL;
所以在调用GetStr后,p的值是NULL,然后p又被赋值为"hello world"字符串的首地址,最后返回了这个地址,然后p已经被pop。
在main中GetStr的返回值与NULL判断是否不同,当然不同,因为GetStr的返回值是"hello world"字符串的首地址,所以会执行printf("\r\n str=%s",str);这段代码。等价于:printf("\r\n str=%s",NULL);,因为str的值为NULL。

从代码上来看,楼主是想在GetStr函数内改变main中的str的值,使str指向"hello world"的首地址,但这样写并不能达到目的。所以我写出了2楼那段代码。

在这里大家可能无法理解的是"hello world"字符串在GetStr执行完毕后是否还存在?当然是存在的,为了能更好的解释这个问题所以我用图片的方式来解释一下:

在我的D盘根目录下有这几个文件:hello.c、test.c
图片附件: 游客没有浏览图片的权限,请 登录注册

hello.c里的内容是:
程序代码:
#include <stdio.h>

int main(void)

{  
    printf("Hello, world!");
    return 0;
}
test.c里的内容是:
程序代码:
#include <stdio.h>
#include <ctype.h>

int main(void)
{
    FILE *   fp = fopen("hello.exe", "rb");
    unsigned i, j, read_size;
    unsigned count = 0;
    char     buffer[16];
   
    while(!feof(fp)) {
        printf("%04X  ", count);
        read_size = fread(buffer, sizeof(char), 16, fp);
        for(i = 0; i < read_size; i++)
            if(i == 7)
                printf("%02X-", buffer[i] & 0x000000FF);
            else
                printf("%02X ", buffer[i] & 0x000000FF);
        if(read_size < 16)
            while(i++ < 16)
                printf("   ");
        for(i = 0; i < read_size; i++)
            if(isprint(buffer[i]))
                printf("%c", buffer[i]);
            else
                printf(".");
        count += 16;
        printf("\n");
    }
   
    fclose(fp);
    return 0;
}
hello.c的目的是输出Hello, world!,test.c代码的功能是一个16进制查看器。
我的目的就是查看编译、链接hello.c文件后hello.exe里面的信息,看看在可执行文件是面是否有"Hello, world!"这样的字符串。如果有,说明"hello world"字符串是静态的,换句话说它是程序代码的一部份,这样GetStr函数执行完毕后它依然存在。

好了,我们编译运行hello.c文件:
图片附件: 游客没有浏览图片的权限,请 登录注册

已经成功输出了Hello, world!
现在我们编译运行test.c,由于输出内容太多,我们把输出重定向到data.txt文本文件中,所以运行test时用的命令是test -> data.txt。
图片附件: 游客没有浏览图片的权限,请 登录注册


好了现在D盘根目录下面有这些文件:
图片附件: 游客没有浏览图片的权限,请 登录注册

现在data.txt里面应该是hello.exe的数据信息,我们看看里面有没有"Hello, world"这样的字符串。
图片附件: 游客没有浏览图片的权限,请 登录注册

在0x1000这里发现了它,好了,我没时间了。


[ 本帖最后由 lz1091914999 于 2011-8-28 13:37 编辑 ]

My life is brilliant
2011-08-28 13:17
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
收藏
得分:3 
关于指针的问题是非常复杂了,但是在学习高级编程语言是不会出现指针的

Discuz!  
好好学习  天天向上
2011-08-28 14:47
likewind_wzx
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-25
收藏
得分:0 
回复 12楼 lz1091914999
非常感谢!
2011-09-16 20:05
快速回复:请教一下大家
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022313 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved