由strcat函数引发的C语言中数组和指针问题的思考

Posted intoxication

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由strcat函数引发的C语言中数组和指针问题的思考相关的知识,希望对你有一定的参考价值。

问题一

首先,来看一下下面这段代码:

#include <stdio.h>
#include <string.h>
int main() {
    char *str = "media";
    char *tmp = "aaa";
    printf("str: %s\\n",str);
    strcat(str,tmp);
    printf("str: %s\\n",str);
    return 0;
}

代码打眼儿一看,功能很明显:把str指针指向的字符串和tmp指针指向的字符串连接起来再赋给str指向的字符串。我们把这个程序运行一下,如下图:
技术图片
报出了段错误,使用cgdb调试一下,发现问题是出在strcat函数处:
技术图片
感觉很奇怪,就去查找了strcat函数的一些示例,发现几乎所有的strcat的示例都是连接的两个数组类型字符串或者一个数组类型一个指针类型(指针类型指向的字符串一定是接在数组字符串之后)。自己手动测试了一下,把*str改为了str[20],发现程序成功运行:
技术图片
后经过一系列的文档查阅,得知定义为指针所指向的字符串是常量字符串,只能读取不能写入。要连接这样的字符串,得另外开辟一个空间存放连接起来的字符串。如果非要将两个变量定义为指针类型,可以把程序修改为以下形式:

#include <stdio.h>
#include <string.h>
int main() {
    char *str = "media";
    char *tmp = "aaa";
    char *res = (char *)malloc(strlen(str)+strlen(tmp)+1);
    printf("str: %s\\n",str);
    strcat(strcpy(res,str),tmp);
    printf("str: %s\\n",res);
    return 0;
}

得到的结果正确:
技术图片

问题二

以上是关于由strcat函数引发的C语言中数组和指针问题的思考的主要内容,如果未能解决你的问题,请参考以下文章

C语言中字符串常用函数--strcat,strcpy

C语言实现两个字符串的拼接

C语言中如何不用strcat函数来连接2个数组

C语言字符串拼接函数:strcat()

用C语言程序,通过自定义函数实现字符串处理函数strcat、 strcpy、strcmp、strlen和的功能

c语言中fread函数怎么用