[实践OK]c语言,malloc分配内存给数组指针并填充内存,給内存赋值实现OOM测试。引入了动态链接库在RSS,VSZ上的一个系统不一致研究并用pmap -x pid查看。
二维数组可以看作是由两个一维数组(一个指针数组,一个基本型别的数组)嵌套而成;
二维数组可以看作是由两个一维数组(一个指针数组,一个基本型别的数组)嵌套而成;
比如a[10][10];
其中a是一个数组,他的每个元素(a[i])(0<=i<10)又是一个数组,如a[i]就是一个数组,它的每个元素为a[i][j](0<=j<10);
其实2维数组中*a就是表示a[0];
实际上在内存中只存在一维数组,它只是在语言这一层次上用二维的方式呈现给语言的使用者。
其实二维数组和一维数组差不多,
一维数组中a[i]与*等同,都指的是值;
二维数组中a[i][j]可分为两部分,a[i]代表指向第i行的指针,也就是第i行的首地址;
a[i][j]代表第i行的第j个元素
#include <stdio.h>
int main()
{
int i;
float a[9]={0,1,2,3,4,5,6,7,8};
float *p=(float*)malloc(9*sizeof(float));
for(i=0;i<9;i++)
{
scanf("%f",p+i);
}
for(i=0;i<9;i++)
{
printf("p==%f\n",*(p+i));
}
}
动态分配内存并填充里面的内容:
[codes=php]
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i,j;
int *p[300];
printf("len of int=%d\n",sizeof(int));
for(i=0;i<300;i++){
p[i]=(int *)malloc(262013*sizeof(int));
for(j=0;j<262013;j++){
*(p[i]+j)=1;
//sleep(1);
//printf("p=%d\n",*(p[i]+j));
}
//sleep(0.1);
}
printf("End...\n");
while(1){
sleep(1);
}
}
[/codes]
make malloc
cc malloc.c -o malloc
./malloc
watch -n 2 ps -opid,ppid,rss,vsz,cmd -C malloc Mon Sep 2 17:17:11 2019
PID PPID RSS VSZ CMD
880 30676 45888 49320 ./malloc
经查实核对,上面的RSS是kb,想要看到M,则要45888/1024=44M ,
244667 ==>280M
61166 ==> 70M
42816 ==> 49.57M (共享内存SO动态链接库占用)为何是50M,是300个数组指针,42816*4*300/1024=50.175
256896 ==>294M
262013 ==>300.42M (主进程)
引入了动态链接库在RSS,VSZ上的一个系统不一致研究并查看前的动态链接库的编译基础原理链接,
[实践OK]Linux如何解决动态库的版本控制, Linux如何解决动态库的版本控制,C语言HelloWorld示例,readelf -d libhello.so.0.0.0 |grep SONAME。
[url=https://jackxiang.com/post/7717/]https://jackxiang.com/post/7717/[/url]
整型点几个字节的问题决定上面能使用多少M的内存:
[codes=php]
#include<stdio.h>
main()
{
char a;
char* b;
short int c;
int d;
unsigned int e;
float f;
double g;
long h;
long long i;
unsigned long j;
printf("char a=%d\n",(int)sizeof(a));
printf("char*b=%d\n",(int)sizeof(b));
printf("short int c=%d\n",(int)sizeof(c));
printf("int d=%d\n",(int)sizeof(d));
printf("unsigned int e=%d\n",(int)sizeof(e));
printf("float f=%d\n",(int)sizeof(f));
printf("double g=%d\n",(int)sizeof(g));
printf("long h=%d\n",(int)sizeof(h));
printf("long long i=%d\n",(int)sizeof(i));
printf("unsiged long j=%d\n",(int)sizeof(j));
}
[/codes]
make int
./int
char a=1
char*b=8
short int c=2
int d=4
unsigned int e=4
float f=4
double g=8
long h=8
long long i=8
unsiged long j=8
来自:https://www.cnblogs.com/TGSB/p/4824246.html
[url=https://www.wntool.com/filesize/]https://www.wntool.com/filesize/[/url]里得出:
整型变量中,上面得出的1个整型有4个字节(byte),也就是4个byte的类型据上面查出有( 8 )位bit。
1M=1048576个Byte,1048576/4=262144是小B,得乘以8=8388608 .
dmesg | grep oom
[ 91.458107] stress-ng (10288): /proc/10288/oom_adj is deprecated, please use /proc/10288/oom_score_adj instead.
dmesg | less -I
用pmap -x pid查看:
pidof main
1589
pmap -x 1589
pmap -x 1589
1589: ./main
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r-x-- main
0000000000600000 4 4 4 r---- main
0000000000601000 4 4 4 rw--- main
00007f79c04da000 355752 355752 355752 rw--- [ anon ]
00007f79d6044000 1804 276 0 r-x-- libc-2.17.so
00007f79d6207000 2044 0 0 ----- libc-2.17.so
00007f79d6406000 16 16 16 r---- libc-2.17.so
00007f79d640a000 8 8 8 rw--- libc-2.17.so
00007f79d640c000 20 12 12 rw--- [ anon ]
00007f79d6411000 4 4 0 r-x-- libhello.so.0.0.0
00007f79d6412000 2044 0 0 ----- libhello.so.0.0.0
00007f79d6611000 4 4 4 r---- libhello.so.0.0.0
00007f79d6612000 4 4 4 rw--- libhello.so.0.0.0
00007f79d6613000 136 108 0 r-x-- ld-2.17.so
00007f79d6658000 1860 1860 1860 rw--- [ anon ]
00007f79d6832000 8 8 8 rw--- [ anon ]
00007f79d6834000 4 4 4 r---- ld-2.17.so
00007f79d6835000 4 4 4 rw--- ld-2.17.so
00007f79d6836000 4 4 4 rw--- [ anon ]
00007fff427ad000 1156 12 12 rw--- [ stack ]
00007fff429e3000 8 4 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 364896 358092 357696
二维数组可以看作是由两个一维数组(一个指针数组,一个基本型别的数组)嵌套而成;
比如a[10][10];
其中a是一个数组,他的每个元素(a[i])(0<=i<10)又是一个数组,如a[i]就是一个数组,它的每个元素为a[i][j](0<=j<10);
其实2维数组中*a就是表示a[0];
实际上在内存中只存在一维数组,它只是在语言这一层次上用二维的方式呈现给语言的使用者。
其实二维数组和一维数组差不多,
一维数组中a[i]与*等同,都指的是值;
二维数组中a[i][j]可分为两部分,a[i]代表指向第i行的指针,也就是第i行的首地址;
a[i][j]代表第i行的第j个元素
#include <stdio.h>
int main()
{
int i;
float a[9]={0,1,2,3,4,5,6,7,8};
float *p=(float*)malloc(9*sizeof(float));
for(i=0;i<9;i++)
{
scanf("%f",p+i);
}
for(i=0;i<9;i++)
{
printf("p==%f\n",*(p+i));
}
}
动态分配内存并填充里面的内容:
[codes=php]
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i,j;
int *p[300];
printf("len of int=%d\n",sizeof(int));
for(i=0;i<300;i++){
p[i]=(int *)malloc(262013*sizeof(int));
for(j=0;j<262013;j++){
*(p[i]+j)=1;
//sleep(1);
//printf("p=%d\n",*(p[i]+j));
}
//sleep(0.1);
}
printf("End...\n");
while(1){
sleep(1);
}
}
[/codes]
make malloc
cc malloc.c -o malloc
./malloc
watch -n 2 ps -opid,ppid,rss,vsz,cmd -C malloc Mon Sep 2 17:17:11 2019
PID PPID RSS VSZ CMD
880 30676 45888 49320 ./malloc
经查实核对,上面的RSS是kb,想要看到M,则要45888/1024=44M ,
244667 ==>280M
61166 ==> 70M
42816 ==> 49.57M (共享内存SO动态链接库占用)为何是50M,是300个数组指针,42816*4*300/1024=50.175
256896 ==>294M
262013 ==>300.42M (主进程)
引入了动态链接库在RSS,VSZ上的一个系统不一致研究并查看前的动态链接库的编译基础原理链接,
[实践OK]Linux如何解决动态库的版本控制, Linux如何解决动态库的版本控制,C语言HelloWorld示例,readelf -d libhello.so.0.0.0 |grep SONAME。
[url=https://jackxiang.com/post/7717/]https://jackxiang.com/post/7717/[/url]
整型点几个字节的问题决定上面能使用多少M的内存:
[codes=php]
#include<stdio.h>
main()
{
char a;
char* b;
short int c;
int d;
unsigned int e;
float f;
double g;
long h;
long long i;
unsigned long j;
printf("char a=%d\n",(int)sizeof(a));
printf("char*b=%d\n",(int)sizeof(b));
printf("short int c=%d\n",(int)sizeof(c));
printf("int d=%d\n",(int)sizeof(d));
printf("unsigned int e=%d\n",(int)sizeof(e));
printf("float f=%d\n",(int)sizeof(f));
printf("double g=%d\n",(int)sizeof(g));
printf("long h=%d\n",(int)sizeof(h));
printf("long long i=%d\n",(int)sizeof(i));
printf("unsiged long j=%d\n",(int)sizeof(j));
}
[/codes]
make int
./int
char a=1
char*b=8
short int c=2
int d=4
unsigned int e=4
float f=4
double g=8
long h=8
long long i=8
unsiged long j=8
来自:https://www.cnblogs.com/TGSB/p/4824246.html
[url=https://www.wntool.com/filesize/]https://www.wntool.com/filesize/[/url]里得出:
整型变量中,上面得出的1个整型有4个字节(byte),也就是4个byte的类型据上面查出有( 8 )位bit。
1M=1048576个Byte,1048576/4=262144是小B,得乘以8=8388608 .
dmesg | grep oom
[ 91.458107] stress-ng (10288): /proc/10288/oom_adj is deprecated, please use /proc/10288/oom_score_adj instead.
dmesg | less -I
用pmap -x pid查看:
pidof main
1589
pmap -x 1589
pmap -x 1589
1589: ./main
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 4 4 0 r-x-- main
0000000000600000 4 4 4 r---- main
0000000000601000 4 4 4 rw--- main
00007f79c04da000 355752 355752 355752 rw--- [ anon ]
00007f79d6044000 1804 276 0 r-x-- libc-2.17.so
00007f79d6207000 2044 0 0 ----- libc-2.17.so
00007f79d6406000 16 16 16 r---- libc-2.17.so
00007f79d640a000 8 8 8 rw--- libc-2.17.so
00007f79d640c000 20 12 12 rw--- [ anon ]
00007f79d6411000 4 4 0 r-x-- libhello.so.0.0.0
00007f79d6412000 2044 0 0 ----- libhello.so.0.0.0
00007f79d6611000 4 4 4 r---- libhello.so.0.0.0
00007f79d6612000 4 4 4 rw--- libhello.so.0.0.0
00007f79d6613000 136 108 0 r-x-- ld-2.17.so
00007f79d6658000 1860 1860 1860 rw--- [ anon ]
00007f79d6832000 8 8 8 rw--- [ anon ]
00007f79d6834000 4 4 4 r---- ld-2.17.so
00007f79d6835000 4 4 4 rw--- ld-2.17.so
00007f79d6836000 4 4 4 rw--- [ anon ]
00007fff427ad000 1156 12 12 rw--- [ stack ]
00007fff429e3000 8 4 0 r-x-- [ anon ]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 364896 358092 357696
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/842/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2019-9-3 15:38
评论列表