以前单纯以为结构体 共用体的内存大小只需要算出每个成员的内存大小求总和就是了,慢慢才知道并不是这样。 那么为什么会出现内存对齐呢, 大部分的参考资料都是如是说的: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 那让我们来弄清楚他的对齐规则吧 例: struct s { doiuble a; int b; char c; float d; }; sizeof(struct s)是多少呢? 其实并不是简单的8+4+1+4=17,而是24。为什么呢? 这里最大的基本类型是double,为8字节,所以该结构体是以8字节对齐的,所以是24. union s { int a; char b[10]; }; 该 继续阅读 >>


吕子健 17/06/21 10:36:29
#include <termio.h> int getch(void) { struct termios tm, tm_old; int fd = 0, ch; if (tcgetattr(fd, &tm) < 0) {//保存现在的终端设置 return -1; } tm_old = tm; cfmakeraw(&tm);//更改终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理 if (tcsetattr(fd, TCSANOW, &tm) < 0) {//设置上更改之后的设置 return -1; } ch = getchar(); if (tcsetattr(fd, TCSANOW, &tm_old) < 0) {//更改设置为最初的样子 return -1; } return ch; } 总 继续阅读 >>


吕子健 17/06/18 20:43:03
今天犯了一个很低级的错误typedef定义链表的时候报错,我是这样定义的 typedef struct{       int a;       int b;       Test *next;   }Test;   错误的原因是 在声明next的时候Test还没有被定义,解决方法如下: struct test{      int a;      int b;      struct test *next;   };   typedef struct test Test;   或者 typedef struct test{      int a;      int b;      test * next;   } 继续阅读 >>


吕子健 17/05/30 10:43:25
插入排序: for(i=1;i<n;i++) { temp=a[i]; for(j=i-1;j>=0&&a[j]>temp;j--) a[j+1]=a[j]; a[j+1]=temp; } 冒泡排序 for(int i=0;i<n-1;i++)     for(int j=0;j<n;j++) { if(arr[j]<arr[j+1]) {  int t=arr[j];  arr[j]=arr[j+1];  arr[j+1]=t;    } 选择排序 for(int i=0;i<n-1;i++)     for(int j=i+1;j<n;j++) { if(arr[i]<arr[j]) {  int t=arr[i];  arr[i]=arr[j]; & 继续阅读 >>


吕子健 17/05/30 10:42:47
矩阵相乘 (得到C[4][3]) void arymul(int a[4][5], int b[5][3], int c[4][3])   {       int i, j, k;       int temp;       for(i = 0; i < 4; i++){           for(j = 0; j < 3; j++){               temp = 0;               for(k = 0; k < 5; k++){                   temp += 继续阅读 >>


吕子健 17/05/30 10:41:56
链表的逆置 struct student *Reverse (struct student *head)   {       struct student *p;      //临时存储       struct student *p1;     //存储返回结果       struct student *p2;     //源结果节点一个一个取          p1 = NULL;          //开始颠倒时,已颠倒的部分为空       p2 = head;          //p2指向链表的头节点       while(p2 != NULL)   &nbs 继续阅读 >>


吕子健 17/05/30 10:40:59
用malloc开辟一个二维数组 #include <stdio.h>   #include <stdlib.h>      int main(void)   {       int i, row, column, **arr;          while (scanf("%d %d", &row, &column) != EOF) {           arr = (int **)malloc(sizeof(int *) * row); // 分配所有行的首地址           for (i = 0; i < row; i ++) { // 按行分配每一列             继续阅读 >>


吕子健 17/05/30 10:39:30