鱼C论坛

 找回密码
 立即注册
查看: 781|回复: 5

[已解决]在函数中复制数组,原数组会改变的疑问。

[复制链接]
发表于 2020-11-5 20:41:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下列代码时想将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++]);
        i-=1;
        while((t[i++] = s[j++] ) != '\0');
}
最佳答案
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[24] = "Programming" ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-5 20:51:03 | 显示全部楼层
可能是你的b长度溢出去 污染了a里面存储的东西
因为 b只能存储 "Programming[\0]"共12个字符,连接上a,就溢出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

这里的溢出,想要表达的是b里面存储的东西超出了b所能存储的范围。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[24] = "Programming" ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表