当前位置:编程学习 > C/C++ >>

C语言指针问题,本人菜鸟,不懂,请大虾指教!!!!急

char *GerMemory(void) { char p[]=”hello world”; return p; } Void Test(void) { Char *str=NULL; Str=GetMemory(); Printf(str); } 请问运行Test函数后有什么样的结果?
追问:没有出现错误,什么也没有出现。能画个图给我看看吗。看懂了,保证追加
答案:首先是编译通不过
就算可以运行,结果是不确定的. 
p是在堆栈中分配的内存.当GetMemory函数结束后,这些内存可能会被其它函数使用。
可能会覆盖p,所以结果是不确定的. 
堆栈是函数共用的,在一个函数中分配的内存,在函数结束后会释放掉,在进入另一个函数时,分配的内存可能会与上一个函数分配的内存重叠。 这就造成了在这个函数中使用这段内存时,可能会覆盖上个函数的内存,但也不一定会全部会覆盖,这要看情况了。 
下面是一个测试程序可以看看:
#include <stdio.h>

char *GetMemory(void)
{
	char p[]="hello world";
	return p;
}

void Test(void)
{
	char *str=NULL;
	str=GetMemory();
	printf(str);
}

int main(int argc, char* argv[])
{
	Test();
	return 0;
}

如果会汇编的话,反汇编,可以看一下汇编代码什么都会明白的.
其他:access violation,访问内存错误,地址非法因为p指向的内存在GetMemory返回时已经被释放 没有main函数是不能运行的
如果改好运行的话当然是输出 hello world了
因为c中数组的名字本身就是一个指针。不过是指针常量,不能改变,GetMemory返回值是一个指向字符串的指针,str也是一个字符串指针,可以直接赋值的。
printf(),里面的参数应是地址,如果是变量的话,比如a,就用取地址符&,就是&a。因为str本身是地址,所以就是上面的样子了
学c的话,好好学学指针,难点也是重点 

我错了,应该 yinfengnong 说的对,刚才忽略了这一点 第一,C是大小写敏感的,Test里面的Char,Str,Printf需要改成char,str,printf(是不是百度改的啊)

然后是指针的问题,c里面有好几种地址,每个变量都需要一个地址来存放他的值。在函数中声明的临时变量(还有在其他任何一种语句块(大括号扩起来的部分))的内存地址是在跳出这个语句块的范围的时候就释放的

因此,变量p存储的地址是在ger~~~函数返回的时候就释放的。(注意!!!!:释放的是存储p的值的内存空间,而不是p这个指针所指的空间!!!!!!!!),也就是说,如果你返回p的地址(就是说如果你返回&p的话,那么指针的内容不一定是p的值)(!!!p是个指针变量,不要把p的地址,p的值(p指向的地址),还有p指向的内容 搞混!!!)

这个问题中涉及到的另一种地址是常量的地址,这种地址是在加载程序的时候就加载到内存里的,就是说这个内存只要程序没有退出就都是可以访问的。!!! 跟全局常量在内存分配上其实是一样的。 只要你获得了他的地址,就可以在整个程序中访问。 就想刚刚回答的samwang1012说。。当你把你的程序改成正确的之后运行的结果应该是不确定的。。因为GetMemory()执行完了之后,字符串hello world所占的空间已经被释放。。。而现在里面是什么东西已经无法得知。。所以你运行的结果可能是空格。。也可能是什么乱七八糟的图案。。 这样写:
char *p="Hello world";
不要这样
char p[]="Hello world";
p是数组就是坏事,
指针没事,我刚才也疏忽了 
此程序没有main()。 同意楼上 yinfengnong 的解释,所以如果想要函数GerMemory结束之后,p所占内存不会被覆盖,就应该令p为全局变量。当然,如果是这样,那函数GerMemory和Test就都没必要了。 这段代码不能运行,因为没有main函数!
可以这样写:
#include "stdio.h"
char *GetMemory(void)
{
	static char p[]="hello world";
	return p;
}
void Test(void)
{
	char *str;
	str=GetMemory();
	printf("%s",str);
}
int main(int argc, char* argv[])
{
	Test();
	return 0;
}
要注意GetMemory里p[]的定义应为static型的,否则返回后p[]里的内容将不复存在,而输出乱码。具体原因留给你自己去研究了,强烈推荐:谭浩强的C语言系列的书!

上一个:sql语句where和having子句的用法区别
下一个:如何编写边坡稳定的c语言程序

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,