memset显示错误的结果[重复]

Posted

技术标签:

【中文标题】memset显示错误的结果[重复]【英文标题】:memset showing wrong results [duplicate] 【发布时间】: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,而主线程堆栈可以增长到远大于此。 【参考方案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 设置字节并适用于字符,因为它们是单字节,但整数不是。

【讨论】:

以上是关于memset显示错误的结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在特定情况下创建替换 memset 如何触发重复符号错误?

C++中char指针中的memset的分段错误(核心转储)[重复]

memset()没有将值设置为一个[重复]

用于长(64位)类型的C ++ memset()[重复]

如何使用 memset 清除 char 数组 [重复]

C中关于Memset的简单问题[重复]