weixin_52884284 2022-07-16 23:27 采纳率: 100%
浏览 35
已结题

关于子函数返回指针的疑问

#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?

  • 写回答

2条回答 默认 最新

  • 微尘8 2022-07-17 00:22
    关注

    问题1一楼回答的正确
    问题2:为什么在子函数要再定义一个p去操作而不能去操作str或者直接返回p
    因为在执行 (*p++) = (*s1++);或 (*p++) = (*s2++);这两个语句的时候,p指针所指向的地址一直在改变,
    直接操作(*str++) = (*s1++);或(*str++) = (*s2++);最后return str;返回的地址已经不再是指向拼接后的字符串中的第一个字符对应的地址
    同理,最后直接执行return p;返回的地址已经不再是指向拼接后的字符串中的第一个字符对应的地址
    同时,返回的地址不是指向malloc分配出来内存块的首地址,主函数中执行 free(str);也会有问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月25日
  • 已采纳回答 7月17日
  • 创建了问题 7月16日