先说结论
使用指针变量作为strcat函数的对象时,char *strcat (char *__restrict __dest, const char *__restrict __src),目标字符串两点注意事项:
- 必须malloc()
- 必须是未赋值的
论证过程
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。
才疏学浅,内容有误请指教!
欢迎共同讨论问题!