C语言在结构体指针内实现数组拷贝时结果异常如何排查
错误定位
问题出在CreateNumArray里的memcpy调用,拷贝长度参数传错了。memcpy的第三个参数要求传入待拷贝内容的总字节数,你当前写的是memcpy(numarray->data, nums, size),传入的是数组元素个数,不是实际需要的字节长度。
你使用的gcc 11.2.0环境下int类型占4字节,测试时传入元素个数为4,实际仅拷贝了4字节内容,刚好够完整写入第一个int元素1,后续数组元素对应的内存没有被拷贝覆盖,读取的是malloc分配的未初始化脏内存里的随机值,因此输出乱码。
修正方案
把memcpy那行代码修改为传入正确的总字节长度即可:
// 原错误写法:memcpy(numarray->data, nums, size); memcpy(numarray->data, nums, size * sizeof(int));
修改后重新编译运行,测试代码就会正常输出1 2 3 4。
实用小技巧:写
memcpy长度参数时可以用size * sizeof(*目标指针)的通用写法,比如这里就可以写成memcpy(numarray->data, nums, size * sizeof(*numarray->data)),后续就算data指针指向的类型调整,这行代码也不需要同步修改,能避免很多长度写错的问题。
内容的提问来源于stack exchange,提问作者Diego FC
相关产品推荐
相关产品推荐

