在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;
}