gpt4 book ai didi

c - 在 C 中多次调用时出现字符串数组指针段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:31 25 4
gpt4 key购买 nike

我有一个非常简单的程序来检查用户参数并打印一些东西。在这里:

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

在 main() 中,如果我打印 printf("%s\n", foo(argv[1])); 一次,程序运行没有错误。但是,如果我如上所示打印三次,我会得到“Segmentation fault: 11”。有任何想法吗?我知道我可以简化 foo 并避免使用“char *result”,但我想了解我对“char *result”的使用有什么问题。

最佳答案

const char * foo(char * input) {
char *result;
strcpy(result, "{ "); // 'result' used uninitialized - undefined behavior

result 未初始化。注意编译器警告。

此外,我假设您想在此处检查input,而不是result:

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

此版本返回静态字符串:

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

此版本返回 mallocd 字符串,您需要释放:

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

关于c - 在 C 中多次调用时出现字符串数组指针段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com