我是C编程的新手,我有几个函数返回类型char *
说我宣布char a[some_int];
,我稍后填写。当我尝试在函数结束时返回它时,它只返回第一个索引处的char
。然而,我注意到的一件事是,如果我在返回之前调用任何类型的函数,它将返回整个a
。例如,我的函数来检查字符串的大小(调用strLength(a);
行的内容。)
我非常好奇这种情况究竟是什么。再一次,我是C编程的新手(你可能已经知道了)。
编辑:此外,如果您对退回此方法的最佳方法有任何建议,请告诉我。谢谢!
编辑2:例如:
我有char ret[my_strlen(a) + my_strlen(b)];
,其中a和b是字符串,my_strlen返回它们的长度。
然后我使用ret
循环填充ret[i] = a[i];
并递增。
当我调用打印输入字符串的函数(作为测试)时,它打印出我想要的方式,但是当我这样做时
return ret;
甚至
char *ptr = ret;
return ptr;
它永远不会向我提供完整的字符串,只是第一个字符。
答案 0 :(得分:0)
一种不返回大量char数据的方法是在函数执行期间将其返回到临时分配在堆栈上的内存中,并且(很可能)之后已用于其他目的返回。
一种可行的替代方法是在堆上分配内存块。确保您阅读并理解堆栈和堆内存之间的区别!如果您选择在堆上分配的一块内存中返回数据,那么malloc()
函数族就是您的朋友(参见man malloc
)。
char* a = (char*) malloc(some_int * sizeof(char))
应该对您有所帮助。一旦你不再需要记忆,请确保忘记释放记忆。
char* ret = (char*) malloc((my_strlen(a) + my_strlen(b)) * sizeof(char))
给出了第二个例子。一旦记忆不再被使用,再也不要忘记释放。
正如 MByD 正确指出的那样,一般情况下不允许使用堆栈上分配的内存来传递和传出数据块。只要在返回的函数堆栈上没有分配块,这也很好。
在下面的场景中,函数b
将在创建的堆栈帧上分配的一块内存上工作,当函数a
输入并生效直到a
返回。所以即使没有在堆上分配内存,一切都会很好。
void b(char input[]){
/* do something useful here */
}
void a(){
char buf[BUFFER_SIZE];
b(buf)
/* use data filled in by b here */
}
作为另一种选择,您可以选择使用全局变量将堆上的内存分配留给编译器。我至少将此选项计入最后一个类别,因为处理不当,全局变量是引发重入和多线程应用程序问题的主要元凶。
快乐的黑客行为和你的学习C任务的好运。