找回密码
 立即注册
查看: 191|回复: 8

在8c2k64s2上使用sizeof的疑惑

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-18 05:29:19 | 显示全部楼层 |阅读模式
按照一般来说,我们在使用sizeof(char);这种语句的时候,编译期即会将将其作为固定的值写在.bin文件中,它的大小在没有意外的情况下,一般是1。但我现在出现了一种奇怪的现象,以下是我的log

[main]:sizeof(char)258, sizeof(short)516, sizeof(int)843, sizeof(long)20880, sizeof(void*)36722

出现这种现象的代码是
  1. DebugPrint(TAG, "sizeof(char)%u, sizeof(short)%u, sizeof(int)%u, sizeof(long)%u, sizeof(void*)%u",
  2.            sizeof(unsigned char), sizeof(unsigned short), sizeof(unsigned int), sizeof(unsigned long), sizeof(void*));
复制代码
我所使用的配置是
MCU: 8C2K642S
使用 keil5 一体化环境,版本为 5.39,C51编译包版本为 c51v956



因为出现了sizeof(char);的值大于1的情况,导致申请了过多的内存,让我使用memset()无法将该内存初始化的情况。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-18 05:40:13 | 显示全部楼层

我感觉我懵逼了

    const char* AT_Param = {0xaa, 0xa1, 0x00};
    const char DataMode = 0xa0;
    long dataLen = 0UL, allocSize = 0UL;
    char* DataPos = NULL, * TempPos = NULL, * TempPos1 = NULL;

    if ( DevData == NULL )
        return MODEL_ERR_ARG;

    dataLen = (DataSize == STRING_LEN_AUTO) ? (long)strlen(DevData) : DataSize;
    allocSize = strlen(AT_CMD) +
        strlen(AT_ADD_PARAM) +
        strlen(AT_Param) +
        sizeof(DevId) +
        MODEL_MAX_USER_DATA +
        strlen(AT_END) + 1;
    DebugPrint(TAG, "will send:%s\nSize:%ld\nalloc size:%ld", DevData, dataLen, allocSize);
//    DataPos = calloc(allocSize, sizeof(unsigned char));
    //DataPos = calloc(allocSize, 1);
    if ( DataPos == NULL )
    {
        free(DataPos);
        return MODEL_ERR_ALLOC;
    }
    memset(DataPos, 0, allocSize);
    memset(DataPos, 0, allocSize);
    DebugPrint(TAG, " %ld check memory: %s", allocSize, DataPos);
    strcat(DataPos, AT_CMD);
    strcat(DataPos, AT_ADD_PARAM);
    strcat(DataPos, AT_Param);
    TempPos = DataPos + strlen(DataPos); // 此时指向了存放ID的位置
    *TempPos++ = (unsigned char)(DevId >> 8);
    *TempPos++ = (unsigned char)DevId;
    *TempPos++ = DataMode; // 赋值结束后TempPos指向了存放用户数据的位置
    TempPos1 = DevData;
    strcat((TempPos + MODEL_MAX_USER_DATA), AT_END); // 预置结束符"\r\n"
    MODEL_LOG_EN(!ENABLE); // 退出透传, 因为透传会导致数据广播转发
    do
    {
        if ( dataLen > MODEL_MAX_USER_DATA )
        {
            memcpy(TempPos, TempPos1, MODEL_MAX_USER_DATA); // copy 21 Bytes
            TempPos1 += MODEL_MAX_USER_DATA; // 数据读了要偏移地址
            dataLen -= MODEL_MAX_USER_DATA; // 减去已经读取的长度
        }
        else
        {
            memset(TempPos, 0, MODEL_MAX_USER_DATA - 1);
            memcpy(TempPos, TempPos1, dataLen);
            DebugPrint(TAG, "strCheck: %s, %s", TempPos, TempPos1);
            strcat(TempPos, AT_END); // 短数据, 在数据后插入结束符"\r\n", 避免读'\0'
            dataLen -= dataLen;
            DebugPrint(TAG, "strCheck: %s, %s", TempPos, TempPos1);
        }
        MODEL_SEND(DataPos);
    } while ( dataLen > 0 );
    MODEL_LOG_EN(!DISABLE); // 重新进入透传
    DebugPrint(TAG, "send:|%s|", TempPos1);
    free(DataPos);
    return MODEL_OK;
 [BT_Model]:will send:from 001a
                    Size:9
                    alloc size:31
                    [BT_Model]: 31 check memory: ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ƒąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽ޿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
                    [BT_Model]:strCheck: ......
                    .................... !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ƒąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽ޿ÀÁÂÃÄÅÆÇÈÉÊËÌÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ, from 001a
                    [BT_Model]:strCheck: ......
                    .................... !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ƒąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽ޿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ, from 001a
                  
[05:32:50.886]½ÓÊա[BT_Model]:send:|from 001a|

打印出来一堆脏字符,希望来个大神能拯救我糟糕的代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-18 05:42:35 | 显示全部楼层

如果内存溢出了,那么为什么 calloc()没有返回 NULL而是返回了一个有效值?

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-18 06:57:50 | 显示全部楼层

问题更正

经过一番测试,其实是两个问题

  • 1、使用 alloc族函数申请的内存无法赋值,但是确确实实是返回了一个非 NULL的指针
  • 2、关于 sizeof的使用,在该环境中出现了上面那种情况,我觉得非常诡异
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-2-18 08:40:15 | 显示全部楼层
试试
DebugPrint(TAG, "sizeof(char)%u, sizeof(short)%u, sizeof(int)%u, sizeof(long)%u, sizeof(void*)%u",
           (u16)sizeof(unsigned char), (u16)sizeof(unsigned short), (u16)sizeof(unsigned int), (u16)sizeof(unsigned long), (u16)sizeof(void*));
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-2-18 10:04:13 | 显示全部楼层
或者%bu试一试
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 08:13:06
已绑定手机

27

主题

341

回帖

1687

积分

金牌会员

机长

积分
1687
发表于 2025-2-18 11:04:00 | 显示全部楼层
%u换成%ul试试?
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-18 19:19:47 | 显示全部楼层
Ayb_*** 发表于 2025-2-18 08:40
试试
DebugPrint(TAG, "sizeof(char)%u, sizeof(short)%u, sizeof(int)%u, sizeof(long)%u, sizeof(void*)% ...

谢谢,强转确实有效
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-04-14 00:31:51
已绑定手机

5

主题

43

回帖

355

积分

中级会员

积分
355
发表于 2025-2-18 19:20:20 | 显示全部楼层

谢谢,%bu 是有效的,出现了预料中的结果
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:48 , Processed in 0.155879 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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