我有以下程序:
#include <stdio.h>
#define MAXLEN 100
char *my_strcat(char *strp1,char *strp2) {
char str[MAXLEN], *strp;
strp = str;
while (*strp1 != '\0') {
*strp++ = *strp1++;
}
while (*strp2 != '\0') {
*strp++ = *strp2++;
}
*strp = '\0';
strp = str;
return strp;
}
void test_strcat(void) {
char *strp1, *strp2, *strp3, str1[MAXLEN], str2[MAXLEN];
printf("Testing strcat! Give two strings:\n");
gets_s(str1, sizeof(str1));
gets_s(str2, sizeof(str2));
strp1 = str1;
strp2 = str2;
strp3 = my_strcat(strp1, strp2);
printf("Concatenated string: %s", strp3);
}
int main(void) {
test_strcat();
}
函数char *mystrcat
应该连接两个字符串,我用它来测试它
test_strcat
。该程序运行没有错误,但不打印连接的字符串,打印一个笑脸符号。我通过调试和它完成了程序
似乎my_strcat
发回的结果是正确的字符串。但是,什么时候
进入应该打印strp3
的最后一行,它显示为红色
调试工具,意味着它的价值即将发生变化。在printf调用之后,strp3
不再指向连接的字符串。任何人都知道可能导致此错误的原因是什么?
答案 0 :(得分:1)
问题在于:
char str[MAXLEN], *strp;
strp = str; // str is a local variable
...
return strp; // <<== WRONG!!!
由于str
是一个本地变量,一旦返回就会消失,strp
指向的值将变为无效,即调用者获取控制权的实例。
使用malloc
而不是在自动存储区域(即堆栈中)分配内存将解决此问题:
char *str = malloc(strlen(strp1)+strlen(strp2)+1);
char *strp = str;
答案 1 :(得分:0)
我建议您采取以下两种方式。
首先,
char *my_strcat(char *strp1,char *strp2) {
static char str[MAXLEN * 2]; /* from char str[MAXLEN] */
第二
char *my_strcat(char *strp1,char *strp2) {
char *str = malloc(strlen(strp1) + strlen(strp2) + 1);
因为在my_strcat函数中,您将str分配为自动变量。 当my_strcat函数完成时,str将被释放。