我有功能:
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)
为了证明这个函数,您还需要传入缓冲区的长度,然后在每次要添加新的查询元素时对其进行检查.
小智 12
发布的解决方案都可以,但只是回答您的问题,为什么会收到警告:
当您在函数中将pie声明为缓冲区时,您没有分配堆内存,而是在堆栈中创建变量.该内存内容仅在该函数的范围内得到保证.一旦你离开函数(返回之后),该内存可以被重用,你可以找到你指向的内存地址随时被覆盖.因此,您将收到警告,您正在返回一个指向内存的指针,该指针无法保证可以保留.
如果要在可以在该函数外部引用的ac函数中分配持久性内存,则需要使用malloc(或其他类型的堆内存分配函数).这将在堆上为该变量分配内存,并且它将持久直到使用free函数释放内存.如果你不清楚堆栈与堆内存,你可能想要谷歌,它将使你的C体验更顺畅.