c语言结构体和内存分配

  1. p 和 "hello,world"存储在内存哪个区域?( ) (鲁科安全)

int main()

{

    char *p = "hello,world";

    return 0;

}

p是在函数内部定义的局部变量,存储在栈区,“holle,world”,属于常量,存储在常量区,.ro段。

  1. 一个由C/C++编译的程序,会将占用的内存分为几个部分:堆、栈、代码段、数据段、BSS段。请问以下程序中的变量a、b、c、d,分别被存在内存的哪个部分?(泰华智慧)

int a = 0;   //全局变量,并且已经赋初始值,存储在数据段

char *b;         //全局变量,但是并没有赋初始值,存储在BSS段。

int main()

{

    int c;                局部变量存放在栈区由计算机负责创建和释放空间。

    static char d = 'a';        静态局部变量,并且已经赋初始值,存放在数据段。

    b = malloc(10);

    *b = d;

    return 0;

}

栈空间用于存放局部变量,由计算机管理。

堆区由程序员手动开辟和释放空间。

数据段用来存储已经赋值的静态变量和全局变量。

BSS段用来存储为赋初始值的全局和静态变量。

  1. 如下代码:变量g_iA,g_iB,g_iC,iD,iE, iF, piG,iH 分别在内存中的什么区( ) (H3C)

int g_iA = 1;                 //全局变量,并且已经赋初始值,存储在数据段

int g_iB;                        //全局变量,但是并没有赋初始值,存储在BSS段。

static int g_iC = 1;        //静态全局变量,并且已经赋初始值,存储在数据段

void func1(){

    static int iD=2;        //静态局部变量,并且已经赋初始值,存储在数据段

    iD++;

    int iE=2;               // 局部变量存放在栈区由计算机负责创建和释放空间

    iE++;

}

void func2(){

    int iF=3;                //局部变量存放在栈区由计算机负责创建和释放空间

    int *piG = (int*) malloc(4);         //局部变量存放在栈区由计算机负责创建和释放空间,但是指针指向的空间是手动开辟的,存放在堆区。

}

int main(){

    int iH = 100;                //局部变量存放在栈区由计算机负责创建和释放空间

}

  1. 有关内存的思考题 (山东山大电力技术有限公司,登虹科技,昆腾微电子)

void GetMemory(char *p)

{

           p =(char *)malloc(100);

}

void Test(void)

{

      char *str=NULL;

    GetMemory(str);

    strcpy(str,"hello world");

    printf(str);

}

在 GetMemory 函数中,通过参数 p 分配内存,但是 p 是一个局部副本的指针,对 p 的修改不会影响原始指针 str。因此,GetMemory 函数调用后,str 仍然是指向 NULL 的。运行程序会造成内存泄漏。

char * GetMemory(void)

{

           char pl[] = "hello world"; //char *p = "hello world"

     return p1;          //返回p1指向的首地址。

}

Void Test(void)

{

           char *str=NULL;

     str = GetMemory();            将函数的返回值返回给str。

     printf(str);

}

结果输出“holle world”

void GetMemory(char **p,int num)

{

           *p = (char *)malloc(num);

}

void Test(void)

{

    char *str = NULL;

    GetMemory(&str, 100);

    strcpy(str, "hello world");

    printf(str);

}

函数通过地址传递的方式将指针指向在另一个函数中手动创建的空间,并通过strcpy函数将hello world函数赋值给指针指向的空间

void Test (void)

{

      char *str = (char *)malloc(100);

    strcpy(str,"hello");

    free(str);

    if(str != NULL)

    {

        strcpy(str, "world");

        printf(str);

    }

}

指针指向手动开辟的空间,然后释放空间,但并没有将指针指向空,导致指针成为野指针。又将字符串赋值给野指针。造成错误.

  1. 堆和栈的区别是什么? (矩阵软件)

管理方式不同,堆由用户管理,栈由计算机管理。

内存大小不同,栈内存大于堆内存。

存储方式不同,堆向上存储,栈向下存储。

开辟空间不同,栈区开辟连续的空间,堆区开辟的空间不连续。

  1. 什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?(山大华天,智洋创新)

内存泄漏是,未能释放已经不再使用的内存空间。程序员未能及时释放自己手动开辟的空间。指针指向未被定义的空间。养成良好的代码习惯,及时释放手动开辟的空间,以及及时将指针置空,在使用指针之前先判断是否为空。

 

  1. 求 sizeof(name1)?(晟安信息)

struct name1{

    char str;

    short x;

    int num;

};

8字节,对于结构体内存大小有成员对齐的特性,先看结构体中数据类型最大的字节内存,按照最大内存且是能把四整除的字节大小,按顺序分配空间,内存足够就不用扩大空间,内存不足则增加最大字节空间的大小。

  1. (电工时代)

typedef struct _a

{

    char c1;

    long i;

    char c2;

    double f;

}a;

typedef struct _b

{

    char c1;

    char c2;

    long i;

    double f;

}b;

sizeof(a) = ___32____;

sizeof(b) = ___24____;

参照上一题的解析。

  1. 给了一个结构体,求 sizeof(struct A) = ____16____。 (鲁科安全,软通动力)

struct A{

    char a;

    char b;

    char c;

    short d;

    int e;

    short f;

}

参照上一题的解析。

  1. 有一个如下的结构体,请问在64位编译器下用 sizeof(struct A) 计算出的大小是多少?( ) (鲁科安全)

struct A{

    long a1;

    short a2;

    int a3;

    int *a4;

}

A. 24               B. 28            C. 16            D. 18

A,参照上面解析。

  1. 有以下说明语句,则下列错误的引用 是( )。(山大华天)

struct stu

{

    int no;

    char name[21];

};

stu w, *p = &w;

A. w.no           B*p.no        C. p->no             D. (*p).no

B,对于结构体中成员的引用,通过结构体名+".",或者指针+“->”来完成。

  1. 写出下述程序结果: (中维世纪)

typedef struct test

{

    char x1;

    short x2;

    float x3;

    char x4;

}TEST_T;

printf("%d", sizeof(TEST_T));

12, 对于结构体内存大小有成员对齐的特性,先看结构体中数据类型最大的字节内存,按照最大内存且是能把四整除的字节大小,按顺序分配空间,内存足够就不用扩大空间,内存不足则增加最大字节空间的大小。

  1. 下面的代码输出是什么,为什么?(64位环境) (信雅达)

struct {

    char *a1;

    long a2;

    short a3;

}A;

int main(void)

{

    printf("%d", sizeof(A));

}

24,参考上题解析。

  1. 设有如下结构定义: struct student { int num; char name[20]; char sex; int age; char addr[30];} stud; 若用printf("%s\n", .....)访问该结构中name值的正确方法是 ( ) (杭州快越科技)

A. stud -> name           B. &stud.name

C. stud.&name             D. stud.name

D,对于结构体中成员的引用,通过结构体名+".",或者指针+“->”来完成。

  1. struct

{

       short a; char b; float c;

}cs;

则sizeof(cs)的值是( ) (苏州特点电子科技)

A.4               B.5               C.7               D.8

D,对于结构体内存大小有成员对齐的特性,先看结构体中数据类型最大的字节内存,按照最大内存且是能把四整除的字节大小,按顺序分配空间,内存足够就不用扩大空间,内存不足则增加最大字节空间的大小。

  1. 如下函数的输出结果是:【 】

struct node

{

   char a; short b; char c; int d;

};

struct node s = { 3, 5, 6, 99 };

struct node *pt = &s;

printf("%X\n", *(int*)pt);

5??03,输出语句将指针强转为int*类型,占四字节,按小端存储,结构体中第一个字节二存放03,第二字节为空,第三四字节存放00,05,这个??  也就是第一个char类型后面的那个NULL字节,置空的话就是0,没有置空就会出现这种垃圾值的问题。

  1. 编程题:定义学生结构体,存储学生的学号、姓名、分数,定义长度为5的结构体数组,实现:

①输入学生信息

②输出学生信息

③计算学生的成绩总分、平均分

④按照学生的分数进行排序

⑤输出排序后的数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>

//创建结构体
typedef struct student{
	int id;
	char name[20];
	float chengji;

}stu_arr;
int  main(int argc, const char *argv[])
{
	stu_arr arr[5];
	int num = 0;
	printf("请输入五个学生\n");
    //循环输入五名学生成绩
	for(int i= 0;i<5;i++){
		scanf("%d %s %f",&arr[i].id,arr[i].name,&arr[i].chengji);
		num+=arr[i].chengji;
	}
    //循环输出
	for(int i=0;i<5;i++){
		printf("%d %s %.2f\n",arr[i].id,arr[i].name,arr[i].chengji);
	}
	printf("总成绩:%d,平均分:%.2f\n",num,num/5.0);
	//使用冒泡排序对结构体按成绩进行排名
    for(int i=1;i<5;i++){
		for(int j=0;j<5-i;j++){
			if(arr[j].chengji<arr[j+1].chengji){
				int t = arr[j].id;arr[j].id = arr[j+1].id;arr[j+1].id = t;
				char a[20];strcpy(a,arr[j].name);strcpy(arr[j].name,arr[j+1].name);strcpy(arr[j+1].name,a);
				float b = arr[j].chengji;arr[j].chengji = arr[j+1].chengji;arr[j+1].chengji = b;
			}
		}
	}
    //循环输出
	for(int i=0;i<5;i++){
		printf("%d %s %.2f\n",arr[i].id,arr[i].name,arr[i].chengji);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值