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日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看