#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *catstr(char * s1,char * s2);
int main(){
char s1[] = "123456";
char s2[] = "67890";
char *str = NULL;
printf("before:str = 0x%x\n",str);
str = catstr(s1,s2);
printf("after:str = 0x%x\n",str);
printf("%s",str);
free(str); //将malloc分配的存储空间释放掉
return 0;
}
char *catstr(char * s1,char * s2){
char * str, *p;
int length = strlen(s1) + strlen(s2) +1;
//长度加1是为了存放'\0'
str = (char *) malloc(length * sizeof(char));
memset(str,0,length * sizeof (char));
p = str; //p指针和str指针同时指向分配的连续存储空间的首元素
while(*s1){
*p++ = *s1++;
//等价于 *p = *s1; p++ ; s1++;
}
while(*s2){
*p++ = *s2++;
//等价于 *p = *s2; p++ ; s2++;
}
return str;
}
问题:str = (char ) malloc(length * sizeof(char))的作用是什么? 为什么在子函数要再定义一个p去操作而不能去操作str或者直接返回p?
问题1一楼回答的正确
问题2:为什么在子函数要再定义一个p去操作而不能去操作str或者直接返回p
因为在执行 (*p++) = (*s1++);或 (*p++) = (*s2++);这两个语句的时候,p指针所指向的地址一直在改变,
直接操作(*str++) = (*s1++);或(*str++) = (*s2++);最后return str;返回的地址已经不再是指向拼接后的字符串中的第一个字符对应的地址
同理,最后直接执行return p;返回的地址已经不再是指向拼接后的字符串中的第一个字符对应的地址
同时,返回的地址不是指向malloc分配出来内存块的首地址,主函数中执行 free(str);也会有问题。
因为函数的作用是拼接字符串,catstr
函数不能保证其参数 s1
和 s2
具有足够的长度,来存放拼接后的结果。这种情况下,通常会有两种方式:
catstr
前,预先进行 malloc 得到一个足够存放结果的区域,并将此区域的指针传入显然,你这里用的就是第二种方式。至于里面的 p
,只是一个中间变量罢了。