在函数中返回char*

Dev*_*vel 5 c function char

我有功能:

char *zap(char *ar) {

    char pie[100] = "INSERT INTO test (nazwa, liczba) VALUES ('nowy wpis', '";
    char dru[] = "' )";
    strcat(pie, ar);
    strcat(pie, dru);
    return pie;
}
Run Code Online (Sandbox Code Playgroud)

主要有:

printf("%s", zap( argv[1] )  );
Run Code Online (Sandbox Code Playgroud)

编译时我收到警告:

test.c: In function ‘zap’:
test.c:17: warning: function returns address of local variable
Run Code Online (Sandbox Code Playgroud)

我该如何归还char*?

小智 18

你最好的选择可能根本就是不返回它 - 而是将你想要填充的缓冲区作为参数传递给函数.

void zap(char * pie, const char *ar) {
    strcpy( pie, "INSERT INTO test (nazwa, liczba) VALUES ('nowy wpis', '");
    char dru[] = "' )";
    strcat(pie, ar);
    strcat(pie, dru);
}
Run Code Online (Sandbox Code Playgroud)

然后像这样称呼它:

char pie[100];
zap( pie, "foo" );
Run Code Online (Sandbox Code Playgroud)

为了证明这个函数,您还需要传入缓冲区的长度,然后在每次要添加新的查询元素时对其进行检查.

  • 缓冲区溢出说你好 (6认同)
  • 如果此代码中存在缓冲区溢出,则原始文件中也会有一个缓冲区溢出.我试图说明一个概念,而不是写出完美的代码. (2认同)

小智 12

发布的解决方案都可以,但只是回答您的问题,为什么会收到警告:

当您在函数中将pie声明为缓冲区时,您没有分配堆内存,而是在堆栈中创建变量.该内存内容仅在该函数的范围内得到保证.一旦你离开函数(返回之后),该内存可以被重用,你可以找到你指向的内存地址随时被覆盖.因此,您将收到警告,您正在返回一个指向内存的指针,该指针无法保证可以保留.

如果要在可以在该函数外部引用的ac函数中分配持久性内存,则需要使用malloc(或其他类型的堆内存分配函数).这将在堆上为该变量分配内存,并且它将持久直到使用free函数释放内存.如果你不清楚堆栈与堆内存,你可能想要谷歌,它将使你的C体验更顺畅.