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

问题一

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

#include

#include

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指向的字符串。我们把这个程序运行一下,如下图:

a265718ec79f7938a1100db15fcca13a.png

报出了段错误,使用cgdb调试一下,发现问题是出在strcat函数处:

C语言strcat函数举例带指针,由strcat函数引发的C语言中数组和指针问题的思考_第1张图片

感觉很奇怪,就去查找了strcat函数的一些示例,发现几乎所有的strcat的示例都是连接的两个数组类型字符串或者一个数组类型一个指针类型(指针类型指向的字符串一定是接在数组字符串之后)。自己手动测试了一下,把*str改为了str[20],发现程序成功运行:

683f7d0d78651ad5c00ef2f422de8d3e.png

后经过一系列的文档查阅,得知定义为指针所指向的字符串是常量字符串,只能读取不能写入。运行过程中,指针变量p所指向的内存是分配在堆中的,且只分配了足够其指向的内容的内存。将q连接到p后,自然p是没有其他空间给q了,所以发生了段错误。要连接这样的字符串,得另外开辟一个空间存放连接起来的字符串。如果非要将两个变量定义为指针类型,可以把程序修改为以下形式:

#include

#include

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;

你可能感兴趣的:(C语言strcat函数举例带指针,由strcat函数引发的C语言中数组和指针问题的思考)