有人可以帮我找到这个C函数中的错误吗?
char* f(int i) {
int i;
char buffer[20];
switch ( i ) {
1: strcpy( buffer, "string1");
2: strcpy( buffer, "string2");
3: strcpy( buffer, "string3");
default:
strcpy(buffer, "defaultstring");
}
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
我认为这与类型转换有关.我的编译器发出警告'int i的声明阴影参数'.
char* f(int i) {
int i;
Run Code Online (Sandbox Code Playgroud)
错误1:本地"i"参数隐藏函数的"i"参数
char buffer[20];
switch ( i ) {
Run Code Online (Sandbox Code Playgroud)
错误2:您使用未初始化的本地"i"变量.
1: strcpy( buffer, "string1");
2: strcpy( buffer, "string2");
3: strcpy( buffer, "string3");
default:
strcpy(buffer, "defaultstring");
}
return buffer;
Run Code Online (Sandbox Code Playgroud)
错误3:返回指向本地数组中元素的指针,该指针在函数返回时无效.'缓冲'已超出范围.
好吧,首先,你错过了switch语句中的'case'声明以及语句末尾的break.尝试将代码更改为:
char* f(int i) {
int i;
char buffer[20];
switch ( i ) {
case 1: strcpy( buffer, "string1"); break;
case 2: strcpy( buffer, "string2"); break;
case 3: strcpy( buffer, "string3"); break;
default:
strcpy(buffer, "defaultstring"); break;
}
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
此外,您将i使用名为的局部变量覆盖您的参数i.所以删除:
char* f(int i) {
char buffer[20];
switch ( i ) {
case 1:
strcpy( buffer, "string1");
break;
case 2:
strcpy( buffer, "string2");
break;
case 3:
strcpy( buffer, "string3");
break;
default:
strcpy(buffer, "defaultstring");
break;
}
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
最后,您将返回一个char指针,该指针指向名为的本地静态声明的字符数组buffer. buffer一旦返回指向其第一个元素的指针(退货语句的作用),就会超出范围.这意味着你最终得到一个指向不再存在的变量的指针.要解决此问题,您可以将指向缓冲区的指针传递给函数,如下所示:
void f(char *buffer, int i) {
switch ( i ) {
case 1:
strcpy( buffer, "string1");
break;
case 2:
strcpy( buffer, "string2");
break;
case 3:
strcpy( buffer, "string3");
break;
default:
strcpy(buffer, "defaultstring");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你确保它buffer足够长以接受字符串,那么最后一个版本应该可以工作.如果你真的想让它变得安全,那么也要考虑它buffer的长度,然后根据你要复制的字符串长度进行检查.