一个编码BUG

如下代码执行结果是什么?

objectivec 复制代码
#include <stdio.h>
#include <string.h>

struct test_info {
        int a;
        char *name;
};

static struct test_info hhh_info[2];
static char test_name[2][8];

int main()
{
        for (int i = 0; i < 2; i++) {
                memset(&hhh_info[i], 0, sizeof(hhh_info));
                snprintf(test_name[i], sizeof(test_name[i]), "good%d", i);
                hhh_info[i].name = test_name[i];
        }

        for (int j = 0; j < 2; j++) {
                printf("hhh_info name: %s\n", hhh_info[j].name);
                printf("test_name[j] is: %s\n", test_name[j]);
        }
        printf("test_name addr is: %p\n", test_name);
        printf("hhh_info addr is: %p\n", hhh_info);

        return 0;
}

gcc编译后执行结果如下:

bash 复制代码
hhh_info name:
test_name[j] is:
hhh_info name: good1
test_name[j] is: good1
test_name addr is: 0x564026243060
hhh_info addr is: 0x564026243040

会发现hhh_info第一个元素为空,奇怪?分析下看下

首先代码bug是由于memset误将整个数组的大小传入,导致第二次循环越界。

objectivec 复制代码
memset(&hhh_info[i], 0, sizeof(struct test_info));

但是为什么会导致第一个元素为空呢?从打印的地址可以看到,test_name和hhh_info相差32字节。struct test_info大小为16字节,hhh_info大小为32字节,所以test_name在内存布局上紧挨着hhh_info,因此,第二次循环时,会将整个test_name空间情况,2x8正好为16字节大小。

稍微调整下代码实现,看下输出结果:

objectivec 复制代码
#include <stdio.h>
#include <string.h>

struct test_info {
        int a;
        char *name;
};

static char test_name[2][8];
static struct test_info hhh_info[2];

int main()
{
        for (int i = 0; i < 2; i++) {
                memset(&hhh_info[i], 0, sizeof(hhh_info));
                snprintf(test_name[i], sizeof(test_name[i]), "good%d", i);
                hhh_info[i].name = test_name[i];
        }

        for (int j = 0; j < 2; j++) {
                printf("hhh_info name: %s\n", hhh_info[j].name);
                printf("test_name[j] is: %s\n", test_name[j]);
        }
        printf("test_name addr is: %p\n", test_name);
        printf("hhh_info addr is: %p\n", hhh_info);

        return 0;
}

gcc编译后执行结果如下:

bash 复制代码
hhh_info name: good0
test_name[j] is: good0
hhh_info name: good1
test_name[j] is: good1
test_name addr is: 0x5649a73c1040
hhh_info addr is: 0x5649a73c1060

低级编码bug可能会产生奇奇怪怪的问题。

相关推荐
图灵机z2 分钟前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法
hans汉斯12 分钟前
计算机科学与应用|改进MeanShift算法在智能监控视频中的应用研究
图像处理·人工智能·功能测试·深度学习·算法·音视频
一次旅行1 小时前
AutoAWQ完整实战:MIT激活感知AWQ量化,模型显存减半、推理提速且精度无损
人工智能·python·算法
GrowthDiary0071 小时前
算法题:寻找二维数组top k问题
数据结构·python·算法
可编程芯片开发2 小时前
基于全阶观测器的三自由度运动系统状态反馈控制simulink建模与仿真
算法
kobesdu2 小时前
从零推导FAST-LIO的观测雅可比矩阵
人工智能·算法·矩阵
乐思智能科技有限公司2 小时前
PLECS软件学习使用(二)直流电机基本系统模型
人工智能·算法·机器学习·面试·职场和发展
随意起个昵称2 小时前
贪心模型-Johnson法则
c++·算法
旋生万物3 小时前
电磁力 = 螺旋联络的 90° 旋转?麦克斯韦方程组的几何重构
人工智能·python·算法·机器学习·copilot·世界模型·物理ai
余俊晖3 小时前
多模态大模型细粒度视觉理解:Vision-OPD在线策略自蒸馏技术方案概述
人工智能·深度学习·算法·多模态·opd