码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-04-27 21:15:51      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:int   一个   clu   字符   std   数组类   数组和指针   mic   手动测试   

问题一

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

#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语言中数组和指针问题的思考

标签:int   一个   clu   字符   std   数组类   数组和指针   mic   手动测试   

原文地址:https://www.cnblogs.com/intoxication/p/10780207.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!