世界杯举办地_世界杯预选赛巴西 - emsxbc.com

strcat()错误应用记录

先说结论

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

必须malloc()必须是未赋值的

论证过程

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

#include

#include

#include

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

#include

#include

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

#include

#include

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

#include

#include

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。

才疏学浅,内容有误请指教!

欢迎共同讨论问题!