[英]C function doesn't return a string
为什么此代码不返回预期的串联字符串,而是2?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char * meh() {
char meh1[32] = "This ";
char meh2[32] = "should work :)";
return strcat(meh1, meh2);
}
int main() {
printf(meh());
return 0;
}
因为一旦离开函数meh,meh1就会超出范围,并且它在堆栈中占据的区域将用于printf内的其他内容。
strcat
通过添加字符串meh1
来修改字符串meh2
,然后返回指向第一个字符串的指针。 在函数中声明了字符串meh1
,因此指针在函数外部无效。 这就是为什么您得不到期望的结果的原因。 相反,您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void meh(char * meh1) {
char meh2[32] = "should work :)";
strcat(meh1, meh2);
return;
}
int main() {
char meh1[32] = "This ";
meh(meh1);
puts(meh1);
return 0;
}
这将得到预期的结果。 之所以meh1
是因为字符串meh1
在main
声明,然后传递给要修改的函数。 这意味着在调用meh
之后,修改后的字符串仍可在main
。
由于strcat()
写入其第一个参数,因此实际上您返回了指向meh1
(第一个元素)的meh1
。 meh1
和meh2
是具有自动存储持续时间的变量。 一旦周围的函数返回,这些变量将被销毁。 访问它们会产生未定义的行为(通常是崩溃)。
您可以执行以下操作:
const char *meh(void)
{
char meh1[32] = "This ";
char meh2[32] = "should work :)";
char *result;
size_t meh1_len, meh2_len;
/* figure out how long meh1 and meh2 are */
meh1_len = strlen(meh1), meh2_len = strlen(meh2);
/* make a new string with enough space */
result = malloc(meh1_len + meh2_len + 1);
if (result == NULL)
perror("Cannot malloc");
/* Copy the strings */
memcpy(result, meh1, meh1_len);
memcpy(result + meh1_len, meh2, meh2_len + 1);
return (result);
}
一旦您不再需要meh()
的结果,别忘了调用free()
。
在strcat()
的手册页中,
char *strcat(char *dest, const char *src);
和
strcat()和函数返回指向结果字符串dest的指针。
根据您的用法, dest
是char meh1[32]
的基地址,它是meh()
本地地址。 一旦控件从meh()
返回, meh1
就会超出范围。 因此, printf()
的结果不确定[未定义的行为]。
要使其工作,请为meh1
使用指针和动态内存分配。
例如,
char *meh1 = NULL;
meh1 = malloc(32);
strcpy(meh1, "this");
和其余的现有meh()
。
可以根据您的要求返回动态分配的指针。 在main()
的末尾,您需要free()
返回的指针,以避免内存泄漏。
另外,您需要像这样使用printf()
printf("%s\n", meh());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.