C语言指针问题,本人菜鸟,不懂,请大虾指教!!!!急
char*GerMemory(void){charp[]=”helloworld”;returnp;}VoidTest(void){Char*str=NULL;Str=G...
char *GerMemory(void)
{
char p[]=”hello world”;
return p;
}
Void Test(void)
{
Char *str=NULL;
Str=GetMemory();
Printf(str);
}
请问运行Test函数后有什么样的结果? 展开
{
char p[]=”hello world”;
return p;
}
Void Test(void)
{
Char *str=NULL;
Str=GetMemory();
Printf(str);
}
请问运行Test函数后有什么样的结果? 展开
8个回答
展开全部
首先是编译通不过
就算可以运行,结果是不确定的.
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;
}
如果会汇编的话,反汇编,可以看一下汇编代码什么都会明白的.
就算可以运行,结果是不确定的.
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;
}
如果会汇编的话,反汇编,可以看一下汇编代码什么都会明白的.
展开全部
这样写:
char *p="Hello world";
不要这样
char p[]="Hello world";
p是数组就是坏事,
指针没事,我刚才也疏忽了
此程序没有main()。
char *p="Hello world";
不要这样
char p[]="Hello world";
p是数组就是坏事,
指针没事,我刚才也疏忽了
此程序没有main()。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一,C是大小写敏感的,Test里面的Char,Str,Printf需要改成char,str,printf(是不是百度改的啊)
然后是指针的问题,c里面有好几种地址,每个变量都需要一个地址来存放他的值。在函数中声明的临时变量(还有在其他任何一种语句块(大括号扩起来的部分))的内存地址是在跳出这个语句块的范围的时候就释放的
因此,变量p存储的地址是在ger~~~函数返回的时候就释放的。(注意!!!!:释放的是存储p的值的内存空间,而不是p这个指针所指的空间!!!!!!!!),也就是说,如果你返回p的地址(就是说如果你返回&p的话,那么指针的内容不一定是p的值)(!!!p是个指针变量,不要把p的地址,p的值(p指向的地址),还有p指向的内容 搞混!!!)
这个问题中涉及到的另一种地址是常量的地址,这种地址是在加载程序的时候就加载到内存里的,就是说这个内存只要程序没有退出就都是可以访问的。!!! 跟全局常量在内存分配上其实是一样的。 只要你获得了他的地址,就可以在整个程序中访问。
然后是指针的问题,c里面有好几种地址,每个变量都需要一个地址来存放他的值。在函数中声明的临时变量(还有在其他任何一种语句块(大括号扩起来的部分))的内存地址是在跳出这个语句块的范围的时候就释放的
因此,变量p存储的地址是在ger~~~函数返回的时候就释放的。(注意!!!!:释放的是存储p的值的内存空间,而不是p这个指针所指的空间!!!!!!!!),也就是说,如果你返回p的地址(就是说如果你返回&p的话,那么指针的内容不一定是p的值)(!!!p是个指针变量,不要把p的地址,p的值(p指向的地址),还有p指向的内容 搞混!!!)
这个问题中涉及到的另一种地址是常量的地址,这种地址是在加载程序的时候就加载到内存里的,就是说这个内存只要程序没有退出就都是可以访问的。!!! 跟全局常量在内存分配上其实是一样的。 只要你获得了他的地址,就可以在整个程序中访问。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就想刚刚回答的samwang1012说。。当你把你的程序改成正确的之后运行的结果应该是不确定的。。因为GetMemory()执行完了之后,字符串hello world所占的空间已经被释放。。。而现在里面是什么东西已经无法得知。。所以你运行的结果可能是空格。。也可能是什么乱七八糟的图案。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
同意楼上 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语言系列的书!
可以这样写:
#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语言系列的书!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询