王锦平 发表于 2025-2-18 05:29:19

在8c2k64s2上使用sizeof的疑惑

按照一般来说,我们在使用sizeof(char);这种语句的时候,编译期即会将将其作为固定的值写在.bin文件中,它的大小在没有意外的情况下,一般是1。但我现在出现了一种奇怪的现象,以下是我的log

:sizeof(char)258, sizeof(short)516, sizeof(int)843, sizeof(long)20880, sizeof(void*)36722
出现这种现象的代码是
DebugPrint(TAG, "sizeof(char)%u, sizeof(short)%u, sizeof(int)%u, sizeof(long)%u, sizeof(void*)%u",
         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()无法将该内存初始化的情况。

王锦平 发表于 2025-2-18 05:40:13

<p>我感觉我懵逼了</p>
<pre><code class="language-c">    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, &quot;will send:%s\nSize:%ld\nalloc size:%ld&quot;, 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, &quot; %ld check memory: %s&quot;, allocSize, DataPos);
    strcat(DataPos, AT_CMD);
    strcat(DataPos, AT_ADD_PARAM);
    strcat(DataPos, AT_Param);
    TempPos = DataPos + strlen(DataPos); // 此时指向了存放ID的位置
    *TempPos++ = (unsigned char)(DevId &gt;&gt; 8);
    *TempPos++ = (unsigned char)DevId;
    *TempPos++ = DataMode; // 赋值结束后TempPos指向了存放用户数据的位置
    TempPos1 = DevData;
    strcat((TempPos + MODEL_MAX_USER_DATA), AT_END); // 预置结束符&quot;\r\n&quot;
    MODEL_LOG_EN(!ENABLE); // 退出透传, 因为透传会导致数据广播转发
    do
    {
      if ( dataLen &gt; 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, &quot;strCheck: %s, %s&quot;, TempPos, TempPos1);
            strcat(TempPos, AT_END); // 短数据, 在数据后插入结束符&quot;\r\n&quot;, 避免读'\0'
            dataLen -= dataLen;
            DebugPrint(TAG, &quot;strCheck: %s, %s&quot;, TempPos, TempPos1);
      }
      MODEL_SEND(DataPos);
    } while ( dataLen &gt; 0 );
    MODEL_LOG_EN(!DISABLE); // 重新进入透传
    DebugPrint(TAG, &quot;send:|%s|&quot;, TempPos1);
    free(DataPos);
    return MODEL_OK;
</code></pre>
<pre><code class="language-text"> :will send:from 001a
                  Size:9
                  alloc size:31
                  : 31 check memory: ,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ƒąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽ޿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
                  :strCheck: ......
                  .................... !&quot;#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ƒąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽ޿ÀÁÂÃÄÅÆÇÈÉÊËÌÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ, from 001a
                  :strCheck: ......
                  .................... !&quot;#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ƒąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽ޿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ, from 001a
                  
½ÓÊա:send:|from 001a|
</code></pre>
<p>打印出来一堆脏字符,希望来个大神能拯救我糟糕的代码</p>

王锦平 发表于 2025-2-18 05:42:35

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

王锦平 发表于 2025-2-18 06:57:50

<h1>问题更正</h1>
<p>经过一番测试,其实是两个问题</p>
<ul>
<li>1、使用 <code>alloc</code>族函数申请的内存无法赋值,但是确确实实是返回了一个非 <code>NULL</code>的指针</li>
<li>2、关于 <code>sizeof</code>的使用,在该环境中出现了上面那种情况,我觉得非常诡异</li>
<li></li>
</ul>

Ayb_ice 发表于 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*));

_奶咖君_ 发表于 2025-2-18 10:04:13

或者%bu试一试

hsrzq 发表于 2025-2-18 11:04:00

%u换成%ul试试?

王锦平 发表于 2025-2-18 19:19:47

Ayb_ice 发表于 2025-2-18 08:40
试试
DebugPrint(TAG, "sizeof(char)%u, sizeof(short)%u, sizeof(int)%u, sizeof(long)%u, sizeof(void*)% ...

谢谢,强转确实有效

王锦平 发表于 2025-2-18 19:20:20

_奶咖君_ 发表于 2025-2-18 10:04
或者%bu试一试

谢谢,%bu 是有效的,出现了预料中的结果
页: [1]
查看完整版本: 在8c2k64s2上使用sizeof的疑惑