strcat()错误应用记录

先说结论

使用指针变量作为strcat函数的对象时,char *strcat (char *__restrict __dest, const char *__restrict __src),目标字符串两点注意事项:

  1. 必须malloc()
  2. 必须是未赋值的

论证过程

1.使用未分配空间的目标字符串

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int args, char *argc[])
{
    char *pro_name,*pro_path,*join_pn;
    pro_name=argc[1];
    pro_path="./is_exist.sh";
    printf("join_pn=%s\tpro_name=%s\n",join_pn,pro_name);
   strcat(join_pn,pro_name); 
   printf("join_pn=%s\n",join_pn);
    system(join_pn);
    return 0;
}

执行结果:
```c
root@lssd:/mnt/c/Users/lssd/lumut/monitor# gcc -o monitor_a monitor_a.c
root@lssd:/mnt/c/Users/lssd/lumut/monitor# ./monitor_a mlp
join_pn=(null)  pro_name=mlp
Segmentation fault (core dumped)
root@lssd:/mnt/c/Users/lssd/lumut/monitor#

gdb跟踪细节就不粘了,具体定位到strcat这一行,增加malloc()后:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int args, char *argc[])
{
    char *pro_name,*pro_path;
    pro_name=argc[1];
    pro_path="./is_exist.sh";
    char *join_pn = (char *) malloc(strlen(pro_name) + strlen(pro_path));
    printf("join_pn=%s\tpro_name=%s\n",join_pn,pro_name);
    strcat(join_pn,pro_name);  
    printf("join_pn=%s\n",join_pn);
    system(join_pn);
    return 0;
}

执行结果:
这里使用system()执行了一个脚本,脚本暂时还没调好,本章不必关注这里。

ot@lssd:/mnt/c/Users/lssd/lumut/monitor# gcc -o monitor_a monitor_a.c
root@lssd:/mnt/c/Users/lssd/lumut/monitor# ./monitor_a mlp
join_pn=        pro_name=mlp
join_pn=mlp
sh: 1: mlp: not found

2.变量赋值后调用strcat()函数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int args, char *argc[])
{
    char *pro_name,*pro_path;
    pro_name=argc[1];
    pro_path="./is_exist.sh";
    char *join_pn = (char *) malloc(strlen(pro_name) + strlen(pro_path));
    join_pn="123";
    printf("join_pn=%s\tpro_name=%s\n",join_pn,pro_name);
    strcat(join_pn,pro_name); 
    printf("join_pn=%s\n",join_pn);
    system(join_pn);
    return 0;
}

执行结果:

oot@lssd:/mnt/c/Users/lssd/lumut/monitor# gcc -o monitor_a monitor_a.c
root@lssd:/mnt/c/Users/lssd/lumut/monitor# ./monitor_a mlp
join_pn=123     pro_name=mlp
Segmentation fault (core dumped)

gdb设置断点,确认仍是执行到strcat()报的段错误。

正确使用

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int args, char *argc[])
{
    char *pro_name,*pro_path;
    pro_name=argc[1];
    pro_path=" ./is_exist.sh";
    char *join_pn = (char *) malloc(strlen(pro_name) + strlen(pro_path));
    printf("join_pn=%s\tpro_name=%s\n",join_pn,pro_name);
    strcpy(join_pn,pro_path);
    strcat(join_pn,pro_name);  
    printf("join_pn=%s\n",join_pn);
    system(join_pn);
    return 0;
}

原因分析

以上两个错误都是字符型指针时出现的,字符型指针指向地址,声明时允许初始化赋值,但初始化后相当于固定了内存中分配的空间,不允许二次赋值了。
所以要么使用字符数组实现,要么定义一个中间变量,相当于正确代码中的join_pn。


才疏学浅,内容有误请指教!
欢迎共同讨论问题!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值