我有下面的代码,我有2个问题,一个是我的[警告]初始化错误使得指针来自整数而没有强制转换,我无法理解为什么,警告显示在行上:< em> printf(&#34;字符串1:%s,其长度为%i \ nString 2:%s,长度为%i \ n&#34;,strg1,strlen(strg1),strg2,strlen(strg2) );
{{1}}
第二个错误是当我将2个字符串合并到第三个字符串时,如果我打印第3个字符串,则会出现图像中的错误。enter image description here
这一部分: printf(&#34;%s,现在字符串3的长度是:%i \ n&#34;,strg3,strlen(strg3));
答案 0 :(得分:1)
由于strg3声明没有以分号结束,因此它表示:
char *strg3 = printf("String 1 : %s and Its length is %i \nString 2 : %s and its length is %i\n", strg1, strlen(strg1), strg2, strlen(strg2));
第二个问题是strg3分配是一个字节(或实际上是一个大小(char))短:
strg3 = (char*) malloc((strlen(strg1)+strlen(strg2)*sizeof(char)));
这不包括'\ 0'终止符的空格。以下strcat将覆盖分配的内存缓冲区。
答案 1 :(得分:0)
char *strg3 =
之后你错过了一个分号。编译器会忽略注释并查找您要分配给strg3
的内容。它找到printf
调用并分配结果。 printf
返回int
(即打印的字符数)。因此,编译器认为您正在为int
分配char* strg3
。只需声明它而不指定任何内容,例如char *strg3;
您需要再分配一个字符strg3
来保存其他2个字符串。
strg3 = (char*) malloc( (strlen(strg1)+strlen(strg2) + 1) *sizeof(char));
C风格的字符串最后需要额外\0
的空间。 strcat
将添加\0
,但会写入不属于strg3
的内存,可能会带来灾难性的结果,例如写入函数的返回地址。