我想分享一个简单明了的(希望如此)代码示例,它应该可以解释自己!
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char* getString();
char * getStringNoMalloc();
void getStringCallByRef(char* reference);
int main(int argc, char*argv[]) {
char * a = getString();
printf("MALLOC ### a = %s \n", a);
free(a);
char * b = getStringNoMalloc();
printf("NO MALLOC ### b = %s \n", b);
char c[100];
getStringCallByRef(c);
printf("CALLBYREF ### c = %s \n", c);
return 0;
}
char* getString() {
char * string;
string = malloc(sizeof(char)*100);
strcat(string, "bla");
strcat(string, "/");
strcat(string, "blub");
printf("string : '%s'\n", string);
return string;
}
char* getStringNoMalloc() {
char string[100] = {};
strcat(string, "bla");
strcat(string, "/");
strcat(string, "blub");
printf("string : '%s'\n", string);
return string;
}
void getStringCallByRef(char* reference) {
strcat(reference, "bla");
strcat(reference, "/");
strcat(reference, "blub");
printf("string : '%s'\n", reference);
}
编译时,您会收到[预期的]警告:
me@box:~$ gcc -o example.o example.c
example.c: In function ‘getStringNoMalloc’:
example.c:58:16: warning: function returns address of local variable [-Wreturn-local-addr]
return string; //but after returning.. it is NULL? :)
^~~~~~
基本上我们在这里讨论的是什么!
运行我的示例将产生以下输出:
me@box:~$ ./example.o
string : 'bla/blub'
MALLOC
string : 'bla/blub'
NO MALLOC
string : 'bla/blub'
CALLBYREF
理论:
用户@phoxis已经很好地回答了这个问题。基本上可以这样想:在{和}之间的所有内容都是局部作用域,因此按照C标准在外部是“未定义”的。
通过使用malloc,您从堆(程序范围)中获取内存,而不是从栈(函数范围)中获取 - 因此它在外部是“可见”的。
第二种正确的方法是按引用调用。在这里,您在父范围内定义变量,因此它使用栈(因为父范围是main())。
总结:
有三种方法可以做到这一点,其中一种是错误的。C语言有点笨拙,不能只是让一个函数返回动态大小的字符串。要么您必须malloc然后free它,要么您必须按引用调用。或者使用C++ ;)
char b = "blah";
不是有效的 C 声明。另外,对于声明为char
的b
,strcpy(a, b)
也无效。你发布的是真实代码吗? - AnT stands with Russia