在C中多次调用时字符串数组指针分段错误

在C中多次调用时字符串数组指针分段错误,c,segmentation-fault,C,Segmentation Fault,我有一个非常简单的程序,可以检查用户参数并打印一些东西。这是: #include <stdio.h> #include <string.h> #include <stdlib.h> const char * foo(char * input){ char *result = NULL; strcpy(result, "{ "); if (strcmp(input, "kittycat") == 0){ strcat(r

我有一个非常简单的程序,可以检查用户参数并打印一些东西。这是:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const char * foo(char * input){
    char *result = NULL;
    strcpy(result, "{ ");
    if (strcmp(input, "kittycat") == 0){
        strcat(result, "JACKPOT!");
    }
    else{
        strcat(result, "Nothing");  
    }
    strcat(result, " }");
    return result;
}

int main(int argc, char *argv[]){
    printf("%s\n", foo(argv[1]));
    printf("%s\n", foo(argv[1]));
    printf("%s\n", foo(argv[1]));
    return 0;
}
#包括
#包括
#包括
常量char*foo(char*input){
char*result=NULL;
strcpy(结果,“{”);
如果(strcmp(输入,“kittycat”)==0){
strcat(结果“头奖!”);
}
否则{
strcat(结果为“无”);
}
strcat(结果“}”);
返回结果;
}
int main(int argc,char*argv[]){
printf(“%s\n”,foo(argv[1]);
printf(“%s\n”,foo(argv[1]);
printf(“%s\n”,foo(argv[1]);
返回0;
}
在main()中,如果我打印
printf(“%s\n”,foo(argv[1])仅一次,程序运行时不会出现错误。然而,如果我像上面所示打印三次,我会得到“分段错误:11”。有什么想法吗?我知道我可以简化foo并避免使用“char*result”,但我想了解我使用“char*result”的错误

结果
未初始化。请注意编译器警告

另外,我假设您希望在此处检查
输入
,而不是
结果

if (strcmp(result, "kittycat") == 0) {

此版本返回静态字符串:

const char *foo(char *input) {
    if (strcmp(input, "kittycat") == 0)
        return "{ JACKPOT! }";
    return "{ Nothing }";
}
此版本返回
malloc
d字符串,您需要
free

#define MAX_FOO_RESULT    20

const char *foo(char *input) {
    char *result = malloc(MAX_FOO_RESULT+1);
    if (!result) return NULL;
    result[0] = '\0';

    strncat(result, "{ ", MAX_FOO_RESULT);

    if (strcmp(input, "kittycat") == 0)
        strncat(result, "JACKPOT!", MAX_FOO_RESULT);
    else
        strncat(return, "Nothing", MAX_FOO_RESULT);

    strncat(result, " }", MAX_FOO_RESULT);

    return result;
}

int main(int argc, char *argv[]){
    const char* res;

    if (argc < 2) return 1;

    // memory leak - result of foo is leaked 
    printf("%s\n", foo(argv[1]));     

    // fixed leak
    res = foo(argv[1]);
    if (res) {
        printf("%s\n", res);
        free(res);
    }

    return 0;
}
#定义MAX_FOO_结果20
常量char*foo(char*input){
char*result=malloc(MAX\u FOO\u result+1);
如果(!result)返回NULL;
结果[0]='\0';
strncat(结果“{”,MAX\u FOO\u结果);
如果(strcmp(输入,“kittycat”)==0)
strncat(结果,“头奖!”,最大福分结果);
其他的
strncat(返回“Nothing”,MAX\u FOO\u RESULT);
strncat(结果“}”,MAX\u FOO\u结果);
返回结果;
}
int main(int argc,char*argv[]){
常量字符*res;
如果(argc<2)返回1;
//内存泄漏-foo的结果泄漏
printf(“%s\n”,foo(argv[1]);
//固定泄漏
res=foo(argv[1]);
如果(res){
printf(“%s\n”,res);
免费(res);
}
返回0;
}

哦,是的,我犯了那个愚蠢的错误。我还是犯了同样的错误。lemme更新我的帖子关于您的静态字符串版本,正如我在帖子中提到的:“我知道我可以简化foo并避免使用“char*result”,但我想了解我使用“char*result”的错误,请阅读文档。它不分配任何内存,您正在向它传递一个空指针。@JonathonReinhart您在foo中有一些错误。我指的是您从未检查argv[1],它可能为空。@self。哦。复制并粘贴了同一个bug,我叫它OP来制作,oops!
#define MAX_FOO_RESULT    20

const char *foo(char *input) {
    char *result = malloc(MAX_FOO_RESULT+1);
    if (!result) return NULL;
    result[0] = '\0';

    strncat(result, "{ ", MAX_FOO_RESULT);

    if (strcmp(input, "kittycat") == 0)
        strncat(result, "JACKPOT!", MAX_FOO_RESULT);
    else
        strncat(return, "Nothing", MAX_FOO_RESULT);

    strncat(result, " }", MAX_FOO_RESULT);

    return result;
}

int main(int argc, char *argv[]){
    const char* res;

    if (argc < 2) return 1;

    // memory leak - result of foo is leaked 
    printf("%s\n", foo(argv[1]));     

    // fixed leak
    res = foo(argv[1]);
    if (res) {
        printf("%s\n", res);
        free(res);
    }

    return 0;
}