读书人

大鸟帮小弟我看看小弟我写的代码哪错了

发布时间: 2013-03-25 15:43:04 作者: rapoo

大鸟帮我看看我写的代码哪错了?


#include <windows.h>
#include <stdio.h>

char* gettime()
{
char s[11];
SYSTEMTIME systm;
GetLocalTime(&systm);
sprintf(s, "%4d-%.2d-%.2d",systm.wYear, systm.wMonth, systm.wDay);
return s; //编译到此处有警告,结果是乱码 要是把S数组设置到1024 还是有警告,但不出现乱码了
}

int main()
{
printf("%s",gettime());

return 0;
}


[解决办法]
警告你不能返回局部变量的地址,你的s是个局部变量,在函数运行结束时其空间会被释放,你返回这个地址取值的话会得到一个不确定的东西。改为动态申请的空间就可以了,不过这个空间在调用函数后要自己释放。
char* gettime() 
{
char *s = new char[11];
SYSTEMTIME systm;
GetLocalTime(&systm);
sprintf(s, "%4d-%.2d-%.2d",systm.wYear, systm.wMonth, systm.wDay);
return s; //编译到此处有警告,结果是乱码 要是把S数组设置到1024 还是有警告,但不出现乱码了
}

int main()
{
char *p = gettime();
printf("%s",p);

delete []p;
p = NULL;
return 0;
}

[解决办法]
返回局部对象和返回地址是不同的,返回局部对象是把值传到函数外的地址
[解决办法]
引用:

char s[] = "adadadsadsafasdasdas"; 警告 有错误
//char *s = "asfasfasfasfassf"; 换成这句就对 这是为什么?

返回这两个值 有什么区别

s[]是指局部变量,分配的内存在func()函数结束时就释放了,而char *s是指向一个字符串常量,是一个只读的内存,在编译时就已经赋值了,不能对其地址所指的值进行修改
[解决办法]
char *s在func()结束时不会被释放的
[解决办法]
你把char s[11];定义成静态的就行了
[解决办法]
引用:
胖蛋他爹:你说的很有道理 但是
#include <stdio.h>

int func()
{
int temp = 6;// 返回局部自动变量的值
return temp;
}


int main()
{
printf("%d",func());

}
这样怎么编译器不提示警告 而且打印值是正确的


这个printf("%d",func());会在执行时产生一func返回值类型的临时变量,你返回char*时也是同样但是char*指向的地址是func函数内栈上的局部值。
[解决办法]
函数返回局部变量是不行的,可以采用参数指针的方式,或者全局变量的方式都可以
[解决办法]
static char s[11];

读书人网 >C++

热点推荐