在函数中复制数组,原数组会改变的疑问。
下列代码时想将a连接到b后面,然后输出a和b,但是输出时a数组被改变了,想了很久都不知道为什么,大佬棒棒忙把!#include<stdio.h>
void strcate(char [],char []);
int main(void)
{
char a[]="Language", b[]="Programming";
strcate(b,a);
printf("%s %s\n",b,a);
}
void strcate(char t[],char s[])
{
int i = 0,j = 0;
while(t);
i-=1;
while((t = s ) != '\0');
} 可能是你的b长度溢出去 污染了a里面存储的东西
因为 b只能存储 "Programming[\0]"共12个字符,连接上a,就溢出了 shooan 发表于 2020-11-5 20:51
可能是你的b长度溢出去 污染了a里面存储的东西
因为 b只能存储 "Programming[\0]"共12个字符,连接上a,就 ...
这里的溢出,想要表达的是b里面存储的东西超出了b所能存储的范围。 本帖最后由 jackz007 于 2020-11-5 22:09 编辑
char a[] = "Language" , b[]="Programming" ;
这一句在程序编译的时候,会为 a 分配 9 个字符空间,恰好能够容纳字符串 "Language" 以及末尾的 '\0';为 b 分配 12 个字符空间,恰好能够容纳字符串 "Programming" 以及末尾的 '\0'。函数 strcate(char t[] , char s[]) 是拼接字符串的,会把字符串 s 拼接到 字符串 t 的末尾。执行 strcate(b , a) 的结果,会把字符串 a 拼接到字符串 b 的末尾,这样拼接后的字符串 b 的长度将是 11 + 8 = 19,外加末尾的 '\0' ,字符串 b 所需要的空间是 20 个字符。可是,b 的容量在编译阶段就已经固定了,是 12,差了 8 个字符空间,显然是小了,这就不可避免的要侵占其它变量所占用的后续存储空间,具体会伤害到函数中的那一个变量我们不得而知(楼主遇到的奇怪现象应该与此直接相关)。这就给程序运行带来了不确定性和隐患,所以,我们一定要尽力避免出现这种情况。
解决问题的方法很简单,只要把 b 的容量定义大一些就可以了。
char a[] = "Language" , b = "Programming" ; jackz007 发表于 2020-11-5 22:05
这一句在程序编译的时候,会为 a 分配 9 个字符空间,恰好能够容纳字符串 "Language" 以及末尾 ...
谢谢! shooan 发表于 2020-11-5 20:51
可能是你的b长度溢出去 污染了a里面存储的东西
因为 b只能存储 "Programming[\0]"共12个字符,连接上a,就 ...
谢谢!
页:
[1]