首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >总内存大小/proc/meminfo

总内存大小/proc/meminfo
EN

Stack Overflow用户
提问于 2017-04-18 20:20:25
回答 1查看 3.4K关注 0票数 2
代码语言:javascript
复制
 struct sysinfo sys_info;
 int32_t total_ram = 0;    
 if (sysinfo(&sys_info) != -1)
   total_ram = (sys_info.totalram * sys_info.mem_unit)/1024;

上述代码中的total_ram值为3671864。但是/proc/meminfo显示了一个不同的值。

代码语言:javascript
复制
cat /proc/meminfo | grep MemTotal
MemTotal:       16255004 kB

他们为什么不一样?在Linux中获得物理RAM大小的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-18 20:34:25

这是溢出造成的。如果涉及的数字超过40亿(如4GB+内存),请确保使用64bit+类型:

代码语言:javascript
复制
 struct sysinfo sys_info;
 int32_t total_ram = 0;    
 if (sysinfo(&sys_info) != -1)
   total_ram = ((uint64_t) sys_info.totalram * sys_info.mem_unit)/1024;

下面是一个完整的示例:

代码语言:javascript
复制
#include <stdint.h>
#include <stdio.h>
#include <sys/sysinfo.h>

int main() {
  struct sysinfo sys_info;
  int32_t before, after;
  if (sysinfo(&sys_info) == -1) return 1;

  before = (sys_info.totalram * sys_info.mem_unit)/1024;
  after = ((uint64_t)sys_info.totalram * sys_info.mem_unit)/1024;
  printf("32bit intermediate calculations gives %d\n", before);
  printf("64bit intermediate calculations gives %d\n", after);
  return 0;
}

编译和运行时:

代码语言:javascript
复制
$ gcc foo.c -o foo -m32 -Wall -Werror -ansi -pedantic && ./foo
32bit intermediate calculations gives 2994988
64bit intermediate calculations gives 61715244
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43481494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档