为什么memset会出错?

时间:2014-02-19 13:13:11

标签: c memset

我正试图以这种方式使用memset()填充矩阵中的零区域:

unsigned short *ptr;
for(int i=0; i < nRows; ++i)
{
    ptr = DepthMat.ptr<unsigned short>(i); /* OCV matrix of uint16 values */
    for(int j=0; j<nCols; ++j)
    {
        uint n=0;
        if(ptr[j] == 0) /* zero region found */
        {
            d_val = ptr[j-1]; /* saves last non-zero value */
            while(ptr[j+n] == 0) 
            { /* looks for non zero */
                ++n;
            }
            d_val = (d_val < ptr[j+n] ? d_val : ptr[j+n]);
            memset( ptr+j, d_val, n*sizeof( ptr[0]) );
            j += n;
        }
    }
}

我查找零序列,然后我存储位置(ptr+j-1ptr+j+n)和零区域边界的值,最后我使用memset()用d_val替换零。 问题是,当我检查存储的值时,它们与d_val不匹配,例如,我将值'222'但我得到'57054'。 任何线索?

2 个答案:

答案 0 :(得分:3)

memset()的value参数只是一个字节,即使参数的类型是int

The manual page将函数描述为:

  

memset - 用常量字节填充内存

因此,d_val的最低8位将被写入内存。由于您将内存视为short数组,因此会得到“错位”值,这些值由在short的字节中重复的相同字节组成。

简而言之,不要这样做;使用for循环重复写入实际的short

答案 1 :(得分:2)

memset一次写一个字符,而你正在短时间访问它们。 57054 = 222 * 256 + 222