在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()无法将该内存初始化的情况。
<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, "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;
</code></pre>
<pre><code class="language-text"> :will send:from 001a
Size:9
alloc size:31
: 31 check memory: ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
:strCheck: ......
.................... !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽÀÁÂÃÄÅÆÇÈÉÊËÌÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ, from 001a
:strCheck: ......
.................... !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ąƇȉʋ̍ΏБғԕؙ֗ڛܝޟ!£ĥƧȩʫ̭ίбҳԵַعڻܽÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ, from 001a
½ÓÊա:send:|from 001a|
</code></pre>
<p>打印出来一堆脏字符,希望来个大神能拯救我糟糕的代码</p>
<p>如果内存溢出了,那么为什么 <code>calloc()</code>没有返回 <code>NULL</code>而是返回了一个有效值?</p>
<h1>问题更正</h1>
<p>经过一番测试,其实是两个问题</p>
<ul>
<li>1、使用 <code>alloc</code>族函数申请的内存无法赋值,但是确确实实是返回了一个非 <code>NULL</code>的指针</li>
<li>2、关于 <code>sizeof</code>的使用,在该环境中出现了上面那种情况,我觉得非常诡异</li>
<li></li>
</ul>
试试
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*)); 或者%bu试一试 %u换成%ul试试?
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 10:04
或者%bu试一试
谢谢,%bu 是有效的,出现了预料中的结果
页:
[1]