首页 > 其他分享 >结构体:修改默认对齐数、结构体传参——《初学C语言第45天》

结构体:修改默认对齐数、结构体传参——《初学C语言第45天》

时间:2024-01-01 14:32:12浏览次数:37  
标签:ps struct int 体传参 45 默认 C语言 printf 对齐

//////——————7.修改默认对齐数

////#pragma:预处理指令,可以改变我们的默认对齐数。

//#include <stdio.h>

//#pragma pack(8)//设置默认对齐数为8//设置的开始

//struct S1

//{

//    char c1;

//    int i;

//    char c2;

//};

//#pragma pack()//取消设置的默认对齐数,还原为默认//设置的结束

//////注意:如果需要在多个结构体中设置不同的默认对齐数

//#pragma pack(1)//设置默认对齐数为1(为1时表示不进行对齐存放,全部紧挨着,最省空间,就不需要再考虑顺序问题了)

//struct S2

//{

//    char c1;

//    int i;

//    char c2;

//};

//#pragma pack()//此代码为取消设置的默认对齐数,还原为默认

//int main()

//{

//    //输出的结果是什么?

//    printf("%d\n", sizeof(struct S1));

//    printf("%d\n", sizeof(struct S2));

//    return 0;

//}

////结论:

////结构在对齐方式不合适的时候,我们可以自根据自己的需求自己更改默认对齐数。




///// /————8. 结构体传参

//#include<stdio.h>

//struct S

//{

// int data[1000];

// int num;

//};

//struct S s = { {1,2,3}, 100 };

////结构体传参

//void print1(const struct S ss)

//{

// int i = 0;

// for(i=0;i<3;i++)

// {

//  printf("%d ",ss.data[i]);

// }

// printf("%d\n", ss.num);

//}

////结构体地址传参

//void print2(const struct S* ps)

//{

// int i = 0;

// for (i = 0; i < 3; i++)

// {

//  printf("%d ", ps->data[i]);

// }

// printf("%d\n", ps->num);

//}

//int main()

//{

// print1(s);  //传结构体(传值调用)直接传值,ss中会有一块单独的空间存放s

// print2(&s); //传地址(传址调用)。传的是s的地址,一个地址的大小是4/8字节,即所需使用的空间就更小一些,

// //效果也就相对于函数传参更加有效果

// return 0;

//}

//在printf1中把s传给ss,更改ss并不会影响s,即s不会被改动过。

// 在printf2中把s的地址传给ps,当误操作ps会导致s的改变,因此在printf2的形参中+count,限制ps改变

//上面的 print1 和 print2 函数哪个好些?

//答案是:首选print2函数。

//原因:

//函数传参的时候,参数是需要压栈(就是在栈空间里面开辟一块区域(或增加一块区域),把形参依次放进去),会有时间和空间上的系统开销。

//如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

// 而当我们采用指针的形式,就不会,就一定程度上变了这个问题的出现

//结论:

//结构体传参的时候,首选传结构体的地址。

标签:ps,struct,int,体传参,45,默认,C语言,printf,对齐
From: https://blog.51cto.com/KKhahaha/9057607

相关文章

  • 初识C语言1(C语言的部分基础认知)(初识系列主要目的在于在脑海中初步建立对C语言的认知,建
    C语言是一门通用计算机编程语言,广泛应用于底层开发。 简述写C语言代码的过程       C语言规定:main函数是程序的入口,同时main函数有且只有一个。(一个工程之中)......
  • P4528 题解
    这篇题解并不做任何形式上的理论推导,而是在于引导像我一样的蒟蒻,如何在遇到这样的题时,不会陷入数据结构暴力分别求三种形态的深渊里无法自拔。看到这道题我们的第一想法应该是把三种形态的数量都求出来,如果可以的话,这题马上就秒掉了。那么我们尝试着去求——比较简单的可能是高......
  • c语言结构体成员内存对齐
    在一个结构体或联合体中,编译器会根据具体成员变量的类型选择边界对齐字节,其选择依据是处理器的ABI规范。c语言处了对结构体或联合体内的变量进行对齐处理外(从结构体内部),还需要将整个数据结构分配在以4字节为边界的地方才有意义。结构体成员变量对齐规则有三条(参考来自网上)https......
  • 二叉树遍历(C语言版)
    二叉树遍历先序递归int*res;voidpreorder(structTreeNode*root,int*returnSize){if(root==NULL)return;//根左右res[(*returnSize)++]=root->val;preorder(root->left,returnSize);preorder(root->right,returnSize);}int*pre......
  • 2023-2024-1 20231407陈原第计算机科学概论与C语言程序设计第十四周学习总结
    这个作业属于哪里计算机科学概论与C语言程序设计作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14作业内容学习C语言程序设计第十三章作业正文  https://www.cnblogs.com/CCCY12345/p/17937889  ......
  • C语言学习-char型数据
    字符型数据1.1字符型常量用单引号括起来的一个字符型常量,且只能包含一个字符,例如'a'、'A'、'1'、''是正确的字符型常量,而'abc'、"a"是错误的字符型常量。1.2字符型变量Markdown更多语法一个字符型常量存放到一个字符型变量中时,实际上并不是把该字符的字型放到内存中,而是把该......
  • 手写topN算法-c语言
    #include<stdio.h>#include<malloc.h>structTreeHeap{intv;};typedefstructTreeHeapTreeHeap;staticvoidprint_bp(intbp[],intlen);voidcreate_treeheap(TreeHeap*treeheap,intdata[10],intbp[11]){treeheap->v=1;......
  • 结构体变量的定义和初始化、结构体内存对齐——《初学C语言第44天》
    //////5.——————结构体变量的定义和初始化////——定义////方式1//structPoint//{// intx;// inty;//}p1;//声明类型的同时定义变量p1////方式2//structPoint//{// intx;// inty;//};//intmain()//{// structPointp2;//定义结构体变量p2// return0......
  • C语言实现井字棋
    首先简述一下:九宫格的棋盘,连成三个连续的即为胜现在拆分三子棋的步骤(1)打印菜单,1开始0退出(2)初始化棋盘(3)打印棋盘(4)玩家下棋,子为’*’(5)判断(6)电脑下棋,为‘#’(7)判断(8)返回步骤三现在分析过后,对其进行编写写game.h(头文件)game.c(游戏主体,函数文件) test.c(测试)我们创建的棋盘大致为下边......
  • [Codeforces] CF1545A AquaMoon and Strange Sort
    CF1545AAquaMoonandStrangeSort题目传送门题意有\(n\)个人从左到右站成一排,从左数第\(i\)个人的衣服上印着\(a_i\)。每个人的朝向可以是朝左、朝右。一开始所有人的方向都是朝右。您可以对这些人做一些“操作”,每次操作允许您找两个相邻的人让他们交换顺序,但是在操作......