c - 为什么 memset 会输入错误的值?

标签 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”。 有什么线索吗?

最佳答案

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

The manual page将该功能描述为:

memset - fill memory with a constant byte

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

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

关于c - 为什么 memset 会输入错误的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21881555/

相关文章:

c - 获取 BitMap 中设置的位列表

c++ - 适用于 x86 的 OpenSolaris 的良好 C/C++ 编译器

c++ - 我们如何在 C++ 中初始化一个全为 0 的 vector

c - 在 C 中使用 memset() 时出现总线错误?

c - memset 中传递数组或指针的第一个参数

c++ - 如何在 Google App Engine Python 2.7 运行时模拟 GNU C 库 drem/remainder 函数?

c - 评估以下表达式

c++ - memset 在 32 位嵌入式平台上速度慢

c++ - C memset 似乎没有写给每个成员

c - 拆分数组中的字符串值