【问题标题】:memset showing wrong results [duplicate]memset显示错误的结果[重复]
【发布时间】:2015-09-29 11:29:49
【问题描述】:

代码是在 C 中检查 memset 的工作。memset 将数组正确初始化为 0,但是当我尝试用 10 初始化它时,它会用一些非常大的垃圾值初始化数组。出了什么问题?

#include <stdio.h>
#include<string.h>
int main(void)
{
    int dp[10008],i;
    memset(dp,10,sizeof(dp));
    for(i=0;i<10;i++)
    printf("%d\n",dp[i]);
    return 0;
}

【问题讨论】:

  • memset 用 10 初始化每个字节。当您解释其中包含 10(或 8 或其他)的四个字节时,您将获得这些值。您需要遍历数据并设置每个整数(不是byte ) 到 10 如果这就是你想要的
  • @amdixon:是的。为什么不写这个作为答案呢?
  • 虽然 a 解决方案在 C 和 C++ 中可能相同,但 C++ 有其他更好的替代方案 (IMO)。请选择您想要解决方案的语言。
  • 您不应该在堆栈上分配大量数据。也就是说,除非你是堆栈溢出的粉丝。
  • @Lundin - 40 kB 并不是大量数据。例如,32 位 Linux 上线程的默认堆栈大小为 2 MB,而主线程堆栈可以增长到远大于此。

标签: c memset


【解决方案1】:

ma​​n memset

       void *memset(void *s, int c, size_t n);

DESCRIPTION
       The  memset()  function  fills  the  first  n  bytes of the memory area
       pointed to by s with the constant byte c.

你的代码:

memset(dp,10,sizeof(dp));

然后将dp中的所有字节初始化为10。

所以你的数组看起来像(按字节):

+----------+----------+----------+----------+
| 00001010 | 00001010 | 00001010 | 00001010 | ...
+----------+----------+----------+----------+

如果你把它解释为一个整数,你会得到(一些大的值)。

以上注释基于 sizeof int as 4 仅用于说明目的..

为了满足您将所有整数初始化为 10 的需求:

#include <stdio.h>
#include <string.h>
int main(void)
{
    int dp[10008],i;
    for(i=0;i<10008;i++)
    {
      dp[i] = 10;
    }
    // do other stuff here..
    return 0;
}

【讨论】:

  • memset 应该从修改后的代码中完全删除。
  • 谢谢,复制+粘贴太多;)
  • 如果有人想对你的好、清晰的代码应用过早的优化:编译器非常擅长优化简单循环,我希望编译器无论如何都会将此循环转换为大内存集
  • @LPs memset 将字节设置为 value。每个字节是8位,10是0x00001010,那为什么会是0x10101010呢?
  • @EnzoFerber 我误解了。我以为是数组表示,而不是字节二进制表示。
【解决方案2】:

memset 设置字节并适用于字符,因为它们是单字节,但整数不是。

【讨论】:

    猜你喜欢
    • 2019-06-30
    • 2021-02-11
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2021-02-23
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多