读书人

字符数组的地址改怎么传啊

发布时间: 2013-04-09 16:45:09 作者: rapoo

字符数组的地址改怎样传啊?
设计一个函数,可以在n个字符后,后第一个空格,制表,换行符,停止读取;
为什么我下面的程序得不到想要的结果?

# include <stdio.h>
# include <ctype.h>
# define LEN 100

char * fake_scanf (void);

int main (void)
{
puts (fake_scanf ());
return 0;
}

char * fake_scanf (void)
{
char * pt;
char ch[LEN];
int ct = 0;
ch[ct] = getchar ();
while (!isspace(ch[ct]) && ct<LEN)
{
ch[++ct] = getchar ();
}
ch[ct] = '\0';
pt = ch;
return pt;
}

[解决办法]
你返回的是局部变量,应该用malloc分配才对。
[解决办法]
引用:
引用:你返回的是局部变量,应该用malloc分配才对。
编译时,也出现了 警告returning local variable , 这里能将详细点吗?

*pt是局部变量,只在作用域char* fake_scanf(){....}这个大括号之间有效,‘}’符号之后就会被销毁。而你返回了局部变量*pt的地址 pt,这个地址的数据在‘}’之后是无效的。
[解决办法]

#include <stdio.h>
#include <ctype.h>
#include <malloc.h>//新加
#include <string.h>//新加
# define LEN 100

char * fake_scanf (void);

int main (void)
{
char *pt;//新加目的是为了能够释放分配的内存,当然这里不释放也暂时也不会有什么问题。
pt=fake_scanf ();//指向这个函数返回的地址
puts (pt);//输出指向内存的内容。
free(pt);
return 0;
}

char * fake_scanf (void)
{
char * pt;
char ch[LEN];//局部变量,函数结束后即失效。

pt = (char *)malloc(LEN);//新加,分配内存。
int ct = 0;
ch[ct] = getchar ();
while (!isspace(ch[ct]) && ct<LEN)
{
ch[++ct] = getchar ();
}
ch[ct] = '\0';
strcpy(pt, ch);//因函数结束后会失效,所以要把局部变量拷贝到分配的内存中,这样返回的pt才是有内容的。
return pt;
}

[解决办法]
你说的return total为什么没有事,因为total和指针不一样的,total就是内存中连续的4个字节,存放一个数,但是指针存放的是别的变量的地址,这种情况返回来的就是野指针了,pt这个指针是个局部变量,他的生存周期随着它所在的局部函数的退栈结束而消亡,这里的消亡是指pt虽然还指向这块内存,但是其中的内容已经消亡了,说点函数栈的事,其实你进入main函数的时候,其实是建了一个main函数栈,函数名就是入口地址,当你调用其他局部函数时,也会相应的建立函数栈,当函数结束时,退栈,函数栈中的数是函数参数,和局部变量

读书人网 >C语言

热点推荐