回复 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 编辑 ]