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】:man 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 应该从修改后的代码中完全删除。 谢谢,复制+粘贴太多;) 如果有人想对你的好、清晰的代码应用过早的优化:编译器非常擅长优化简单循环,我希望编译器无论如何都会将此循环转换为大内存集 @LPsmemset
将字节设置为 value
。每个字节是8位,10是0x00001010
,那为什么会是0x10101010
呢?
@EnzoFerber 我误解了。我以为是数组表示,而不是字节二进制表示。【参考方案2】:
memset 设置字节并适用于字符,因为它们是单字节,但整数不是。
【讨论】:
以上是关于memset显示错误的结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章