指针与返回字符串函数的一个疑惑!!!
下面的函数是要返回一个字符串!!
请问三种写法是否都正确??
(1)char *CheckName(char *mess)
{
char *temp;
temp=malloc(sizeof(mess)*2);
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
(2)char *CheckName(char *mess)
{
char temp[20];
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
问题点数:2、回复次数:43Top
1 楼creamymami(尤文图斯)回复于 2006-11-15 15:55:48 得分 0
2好象不对,temp数组是局部的,函数结束就释放了,返回的指针是未知空间Top
2 楼boot2006()回复于 2006-11-15 16:08:27 得分 0
sizeof(mess)这样求出来的是指针大小4,若按照楼主的意思,那么,函数应该这样
char *CheckName(char *mess, int len),跟上mess的长度,这样才行Top
3 楼lujun5100(笑笑)回复于 2006-11-15 16:19:24 得分 0
所以说1是不对地
2还不是很清楚。。。我觉得可行,要实验下才知道
指针是万恶之源!!Top
4 楼alan001(星岛孤裔林郎君)回复于 2006-11-15 16:19:34 得分 0
不标准,记住用free()释放空间......Top
5 楼alan001(星岛孤裔林郎君)回复于 2006-11-15 16:21:11 得分 0
2个例子不对,堆栈上的指针内容是不保证的.....................Top
6 楼mmqmjy(莫名其妙)回复于 2006-11-15 16:27:01 得分 0
2明显是错的
1中malloc的参数也有问题,应该是malloc(strlen(mess)+strlen(".exe")+1);
指针不是万恶之源,是最灵活最好用的东西Top
7 楼lujun5100(笑笑)回复于 2006-11-15 16:28:30 得分 0
乱七八糟,看不下去了快Top
8 楼left_zxp(专逃课的左手)回复于 2006-11-15 16:48:21 得分 0
mmqmjy正解,指针是C最强大的东东Top
9 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-15 17:08:41 得分 0
1,dui, dont forget to free the pointer
2,cuo, the space allocated via stack ,after the function exit,the stack will free it
Top
10 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:20:06 得分 0
da jia hui yi xia !!Top
11 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:28:35 得分 0
(1)是需要释放指针,但分配空间sizeof()不对吗!strlen()返回的是字节数吗?
(2)*mess可以看成是mess[];而且是函数参数,怎抹灰错呢?Top
12 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:28:59 得分 0
清高手赐教Top
13 楼boot2006()回复于 2006-11-15 17:35:27 得分 0
(1)分配空间用sizeof没错,但是你对char *mess用sizeof,算出来的是这个指针的大小,也就是4
而不是你想要的这个串的大小
(2)你的char temp[20]是在栈上分配的,在函数返回的时候就无效了Top
14 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:38:21 得分 0
char temp[20]是不是应该作为参数传进来?Top
15 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:41:22 得分 0
栈的空间分配是在函数值返回之前,就结束释放空间吗?Top
16 楼luojinzhong2002(Big boy)回复于 2006-11-15 17:41:55 得分 0
请赐教!!Top
17 楼boot2006()回复于 2006-11-15 17:45:13 得分 0
temp 作为参数传递也可以,也就是所谓的值-结果行
void CheckName(char *mess, char *temp)
{
strcpy(temp,mess);
strcat(temp,".exe");
}
这样你的保证temp有合法且足够的空间
Top
18 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-15 17:51:35 得分 0
1想法对,但malloc尺寸计算不对,
(1)char *CheckName(char *mess)
{
char *temp;
temp=malloc(sizeof(mess)*2);
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
mess是指针的话,得sizeof(mess)不正确
所以数组名的话得到原数组的长度
按目的的看
temp = malloc(sizeof(mess/*数组名*/) + 4 + 1);
末字符的赋值0Top
19 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-15 17:52:46 得分 0
不对的,返回局部变量的指针,栈释放,指针指向了个未知地方
(2)char *CheckName(char *mess)
{
char temp[20];
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}Top
20 楼todototry(来csdn,学会扯淡了...)回复于 2006-11-15 17:53:06 得分 0
个人意见,高手多多指教Top
21 楼jackeylb()回复于 2006-11-15 18:24:28 得分 0
两个都不对!!
第一个要进行强制转换,如下:
char *CheckName(char *mess)
{
char *temp;
temp=(char*)malloc(sizeof(mess)*2);
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
第二个,当返回时,系统会自动回收资源,所以将不会有值返回出来Top
22 楼realfei83(会飞的人)回复于 2006-11-15 19:18:15 得分 0
两个都 不对。
(1)char *CheckName(char *mess)
{
char *temp;
temp=malloc(sizeof(mess)*2);
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
(2)char *CheckName(char *mess)
{
char temp[20];
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
Top
23 楼realfei83(会飞的人)回复于 2006-11-15 19:41:11 得分 0
(1)char *CheckName(char *mess)
{
char *temp;
/*
sizeof(mess) 返回的是指向字符串指针的大小,在32位操作系统中指针变量占用4个字节的内存,不管是 int*,还是char* 用一个样,占4字节内存。
*/
temp=malloc(sizeof(mess)*2); //所以这是是错的, 最后记得用完 temp 要free
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
(2)char *CheckName(char *mess)
{
// char temp[20] 是在栈里分配了 20 * sizeof(char) 个字节,在C语言里 char = 8bits,所以是一个字节,20 * sizeof(char) 也就是分配了20个字节。
// 堆和栈是不同的,在栈里分配的内存在函数退出后会自动释放所占的内存,堆内存分配是由程序员自己控制的,如:char *name = (char *)malloc(20 * sizeof(char)); strcpy(name, "NorthWind"); free(name); // 要记得,堆内存分配后,用完后要释放。
char temp[20];
strcpy(temp,mess);
strcat(temp,".exe");
return temp; // 因为temp 在函数退出后自动被释放,所以返回的temp是个空悬指针。
}Top
24 楼qxbnit(蓝灵)回复于 2006-11-15 22:37:36 得分 0
free?!
!!!!
????Top
25 楼qxbnit(蓝灵)回复于 2006-11-15 22:38:12 得分 0
return?!
!!!!
????Top
26 楼Nowish(看我能忍耐多久)回复于 2006-11-16 08:51:13 得分 0
mark~Top
27 楼xkb_surfing()回复于 2006-11-16 09:25:45 得分 0
两个没有一个对的Top
28 楼haroldi()回复于 2006-11-16 09:57:08 得分 0
请问这里怎么free 掉temp????
free 后还怎么返回?Top
29 楼aa3000(杀手K)回复于 2006-11-16 10:36:12 得分 0
用完 temp 之后再 free
char *CheckName(char *mess)
{
char *temp;
temp = malloc(strlen(mess) + strlen(".exe") + 1);
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
char a[] = "abcd";
char * p= CheckName(a);
// do something here width p , but not resize the p buffer
free(p);
Top
30 楼lzq123335(你答题来我给分)回复于 2006-11-16 11:02:31 得分 0
2好象不对,temp数组是局部的,函数结束就释放了,返回的指针是未知空间
#################################
char *temp; temp也是局部变量,
char temp[20]也是局部变量。为什么前者函数结束,返回指针不是未知空间?
如果两个都要用的话,怎么要在这个函数内要free呢?
Top
31 楼lingdianhuoyan()回复于 2006-11-16 11:12:45 得分 0
ls的基本正确!不过在temp=(char*)malloc(strlen(mess)+strlen(".exe")+1);要强制转换!Top
32 楼haroldi()回复于 2006-11-16 16:45:11 得分 0
aa3000(杀手K) ( )
用完 temp 之后再 free
char *CheckName(char *mess)
{
char *temp;
temp = malloc(strlen(mess) + strlen(".exe") + 1);
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
char a[] = "abcd";
char * p= CheckName(a);
// do something here width p , but not resize the p buffer
free(p);
又建一指针p指向返回的指针,那...指针p的释放与返回的指针 有什么关系??
返回的指针 并没有被释放啊.
谁能帮帮教教我啊,谢谢!
Top
33 楼neustrong(小强)回复于 2006-11-16 16:52:16 得分 0
都不对,,Top
34 楼sevenzeal(I`m Pointer .Pointer is heart.So S=NULL)回复于 2006-11-16 23:34:42 得分 0
指针是万恶之源!!
??????????????
不管指针是什么 偶的最爱Top
35 楼dyts0000()回复于 2006-11-19 10:44:45 得分 0
temp=malloc(sizeof(mess)*2)应该写成temp=(char *)malloc(sizeof(mess)*2),其次sizeof(mess)是求取分配给指针变量的字节数,但是第一种写法可以正常运行,即使写成temp=(char *)malloc(1);这个就有点不明白了。
第二种写法看上去没什么问题,但是运行时就有问题了。如果mess所指向的字符串长度小于20,假定是"hello",运行结果是只输出"he",后面是一堆乱码,可如果将temp[20]改成temp[30],结果就正确了。照理说temp[20]已经足够大了,可为什么会出现这种情况呢?
期待高人的回答.....
Top
36 楼myskyx()回复于 2006-11-19 11:27:10 得分 0
局部分配的空间,在函数一运行就识放了Top
37 楼myskyx()回复于 2006-11-19 11:28:16 得分 0
char *CheckName(char *mess)
{
char *temp;
temp=malloc(sizeof(mess)*2);
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
(2)char *CheckName(char *mess)
{
char temp[20];
strcpy(temp,mess);
strcat(temp,".exe");
return temp;
}
局部变量在外局是不能访问的Top
38 楼shanzhongyufu(山中渔夫)回复于 2006-11-19 11:28:47 得分 0
两种都不好,
(1)中temp=malloc(sizeof(mess)*2); --> temp=malloc(strlen(mess)*2);
调用后记得释放temp
(2)中temp[20]局部数组,函数结束内存释放,虽然有可能可以继续使用,但是结果为定义,不是标准的写法。
Top
39 楼shanzhongyufu(山中渔夫)回复于 2006-11-19 11:33:08 得分 0
没细看,应该是
(1)中temp=malloc(sizeof(mess)*2); --> temp=malloc(strlen(mess)+strlen(".exe")+1);
Top
40 楼shanzhongyufu(山中渔夫)回复于 2006-11-19 11:34:55 得分 0
图省事还可以将temp=malloc(strlen(mess)+strlen(".exe")+1); -->
temp=malloc(strlen(mess)+5); 呵呵Top
41 楼liusujian02(刘阿建)回复于 2006-11-19 15:18:05 得分 0
其他的不说
自己亲自试验一下就知道其中的原因
你可以尝试着不要先去问别人
自己先想想问题的解决办法
给你推荐一本书
《提问的智慧》Top
42 楼realfei83(会飞的人)回复于 2006-11-19 16:35:31 得分 0
第二种写法看上去没什么问题,但是运行时就有问题了。如果mess所指向的字符串长度小于20,假定是"hello",运行结果是只输出"he",后面是一堆乱码,可如果将temp[20]改成temp[30],结果就正确了。照理说temp[20]已经足够大了,可为什么会出现这种情况呢?
=================================================================================
出现上面这种情况是你还没了解C语言的内存分配机制。
要先分清"堆", "栈"的内存分配是不同的。
注意C/C++里的关键字“auto”,auto意思是定义自动变量。
auto 只能在函数中使用,表是当函数退出时释放变量所占的内存。
例如:
void f()
{
auto int i = 10; // 等于 auto int i = 10;
}
//////////////////////
void func(char *name)
{
char temp[20]; // 这里是在栈中分配20个字符。
strcpy(temp, name);
printf("%s\n", temp);
// 这里temp就被释放了
// here~~~~~~~~~~~~~~~~!
return; // 在函数返回前,temp被自动释放(temp被释放掉的内存,可以被程序重新使用)
// 所以出现下面这种情况
/*
如果mess所指向的字符串长度小于20,假定是"hello",运行结果是只输出"he",后面是一堆乱码,可如果将temp[20]改成temp[30],结果就正确了。照理说temp[20]已经足够大了,可为什么会出现这种情况呢?
temp 在return temp 前就被释放了,就所改成 char temp[10000]也是错的,
反汇编一下就什么都清楚了
*/
}
int main()
{
auto int i; // int i 等于 auto int i,只是通常写变量定义时auto一般不写。
i = 10;
func("realfei83");
return 0;
}
Top
43 楼realfei83(会飞的人)回复于 2006-11-19 16:36:42 得分 0
为了这2分我容易吗!我~
这么还不给分Top




