取什么名字好… 发表于 2020-11-5 20:41:04

在函数中复制数组,原数组会改变的疑问。

下列代码时想将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');
}

shooan 发表于 2020-11-5 20:51:03

可能是你的b长度溢出去 污染了a里面存储的东西
因为 b只能存储 "Programming[\0]"共12个字符,连接上a,就溢出了

shooan 发表于 2020-11-5 20:52:17

shooan 发表于 2020-11-5 20:51
可能是你的b长度溢出去 污染了a里面存储的东西
因为 b只能存储 "Programming[\0]"共12个字符,连接上a,就 ...

这里的溢出,想要表达的是b里面存储的东西超出了b所能存储的范围。

jackz007 发表于 2020-11-5 22:05:42

本帖最后由 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" ;

取什么名字好… 发表于 2020-11-5 22:56:28

jackz007 发表于 2020-11-5 22:05
这一句在程序编译的时候,会为 a 分配 9 个字符空间,恰好能够容纳字符串 "Language" 以及末尾 ...

谢谢!

取什么名字好… 发表于 2020-11-5 22:57:09

shooan 发表于 2020-11-5 20:51
可能是你的b长度溢出去 污染了a里面存储的东西
因为 b只能存储 "Programming[\0]"共12个字符,连接上a,就 ...

谢谢!
页: [1]
查看完整版本: 在函数中复制数组,原数组会改变的疑问。