有关char指针类型的C函数的问题,有人可以解释一下吗?

JJ.*_*JJ. 4 c

有人可以帮我找到这个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的声明阴影参数'.

nos*_*nos 8

  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:返回指向本地数组中元素的指针,该指针在函数返回时无效.'缓冲'已超出范围.


Dan*_*ham 6

好吧,首先,你错过了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的长度,然后根据你要复制的字符串长度进行检查.