char* SubString(char *source,int pos,int length)
{
char Disc[255];
char str[255];
int i;
strcpy(str,source);
for(i = 0; i < length; i++)
Disc[i] = str[i+pos];
Disc[i] = 0;
return Disc;
}
void main()
{
char str[100];
char data[] = "hello, world!";
char *p;
p = SubString(data, 2, 6);
strcpy(str, p);
printf("str is %s\n", str);
}
在vc6.0上运行,结果是
str is llo, w
为什么结果是对的呢,当调用完SubString函数后, 不就释放子函数里面局部变量的内存吗,那么Disc里面的内容应该就被释放了, 那么p指向的字符串就应该是随机的或者是空的.
12 个解决方案
#include
#include
char* SubString(char *source,int pos,int length)
{
char Disc[255];
char str[255];
int i;
strcpy(str,source);
for(i = 0; i < length; i++)
Disc[i] = str[i+pos];
Disc[i] = 0;
return Disc;
}
char *ss()
{
char tt[10];
int i;
for (i = 0; i < 10; i++)
{
tt[i] = '0' + i;
}
return tt;
}
void main()
{
char str[100];
char data[] = "hello, world!";
char *p;
char *p1;
p = SubString(data, 2, 6);
strcpy(str, p);
printf("str is %s\n", str);
p1 = ss();
printf("ss is %s\n", p1);
}
那为什么ss这个函数又是错的呢
那为什么ss这个函数又是错的呢
================
tt是局部变量tt[]的地址啊!可以返回局部变量,但不可以返回局部变量的地址。因为局部变量的地址在栈上,函数调用完毕后栈被销毁,在栈上的地址不是就无效了么?!
#include
#include
char* SubString(char *source,int pos,int length)
{
char Disc[255];
char str[255];
int i;
strcpy(str,source);
for(i = 0; i < length; i++)
Disc[i] = str[i+pos];
Disc[i] = 0;
return Disc;
}
#include
#include
char* SubString(char *source,int pos,int length)
{
char Disc[255];
char str[255];
int i;
strcpy(str,source);
for(i = 0; i < length; i++)
Disc[i] = str[i+pos];
Disc[i] = 0;
return Disc;
}
char *ss()
{
char tt[10];
int i;
for (i = 0; i < 10; i++)
{
tt[i] = '0' + i;
}
return tt;
}
void main()
{
char str[100];
char data[] = "hello, world!";
char *p;
char *p1;
p = SubString(data, 2, 6);
strcpy(str, p);
printf("str is %s\n", str);
p1 = ss();
printf("ss is %s\n", p1);
}
那为什么ss这个函数又是错的呢
void main()
{
char str[100];
char data[] = "hello, world!";
char *p;
char *p1;
p = SubString(data, 2, 6);
strcpy(str, p);
printf("str is %s\n", str);
p1 = ss();
printf("ss is %s\n", p1);
}
那为什么ss这个函数又是错的呢
为什么结果是对的呢,当调用完SubString函数后, 不就释放子函数里面局部变量的内存吗,那么Disc里面的内容应该就被释放了, 那么p指向的字符串就应该是随机的或者是空的.
退出函数的时候,系统只是修改了栈顶的指针,并没有清内存;
所以,是有可能正常访问到局部变量的内存的。
但因为栈是系统自动管理的,所以该内存可能会被分配给其他函数,这样,该内存的内容就会被覆盖;不再是原来的值了。
刚才的ss函数写错了,抱歉
char *ss()
{
char tt[100];
int i;
for (i = 0; i < 10; i++)
{
tt[i] = '0' + i;
}
tt[i] = 0;
return tt;
}
楼主那程序有可能只是碰巧,总之不要返回局部变量的地址。
其实说白了,就是返回局部变量指针的结果不确定性问题。
追究具体原因根据不同的编译器,原因也不尽相同。
我说一个普遍原因,这也是我所猜测的,并不一定准确。
首先,你的SubString函数返回,栈指针回退至调用前位置,但是,编译器没有做栈清除操作,而这部分内存也是可以访问的,同时你也指定了字符串结尾的0标志,因此可以获得正确结果。此后,你又调用了ss函数,入栈,这是可能要对栈一些处理(SubString函数同样如此),之后改变了栈内的内容,而你最后没有指定字符串结尾的0标志,因此有可能访问到了非法内存。所以有错。
vc編譯器是經常出軌,建議微軟自己寫一個語言標準,日
char* strcpy(char*strDest, const char*strSrc)
{
assert((strDest != NULL) && (strSrc != NULL));
char *address = strDest;
while ((*strDest++ = *strSrc++) != '')
continue;
return address;
}
这个函数不是也可以返回局部变量的指针吗?
这是一种很危险的行为,能得到正确的结果,只能用万幸来形容。
如果在加一句,你看看还能得到正确结果吗?
char str[100];
char data[] = "hello, world!";
char *p, *p2;
p = SubString(data, 2, 6);
p2 = SubString(data, 2, 2); // 追加这一句
strcpy(str, p);
printf("str is %s\n", str);
某些编译器的任务栈是确定的,只要之后调用的函数没有达到栈的深度破坏某个变量,它就有效。毫无疑问这是非常危险的,楼上给出的例子很能说明这一点。