9.14数据结构作业

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

int main()
{
    char *p = "hello,world";
    return 0;
}

答:p是局部变量 ,存储在栈区,"hello,world"是字符串常量,存储在静态全局区的.ro段

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

int a = 0;
char *b;
int main()
{
    int c;
    static char d = 'a';
    b = malloc(10);
    *b = d;
    return 0;
}

答:
A:数据段、已初始化的全局变量

B:.BSS段、未初始化的全局变量
C:栈区、局部变量

D:数据段、静态局部变量,存放字符串常量3、

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

int g_iA = 1;
int g_iB;
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;
}

答:

g_iA:.date段,已初始化的全局变量

g_iB:.BSS段,未初始化的全局变量

g_iC:.date段,已初始化的全局变量

iD:.date段,已经初始化的static变量

iE:栈区,局部变量

iF:栈区,局部变量

piG:

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

 4.1、请问运行 Test 函数会有什么样的结果?

void GetMemory(char *p)
{
		p =(char *)malloc(100);
}
void Test(void)
{
	  char *str=NULL;
    GetMemory(str);
    strcpy(str,"hello world");
    printf(str);
}

答:段错误、内存泄漏、内存越界

调用GetMemory分配内存给形参,与str没有关系,str未开空间,赋值会报段错误

形参指针p开空间未释放,导致内存泄漏

str未开空间,赋值会访问不可控,造成内存越界

  4.2、请问运行 Test 函数会有什么样的结果?

char * GetMemory(void)
{
		char pl[] = "hello world"; //char *p = "hello world"
     return p1;
}
Void Test(void)
{
		char *str=NULL;
     str = GetMemory();
     printf(str);
}

答:无输出

p1指针为局部变量,只能在函数内使用,在函数外面p1所指向的空间会被释放。

  4.3、请问运行 Test 函数会有什么样的结果?

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);
}

答:输出hello world

char **p,p是存放一级指针地址的指针,所以*p就是一级指针==str

 4.4、请问运行 Test 函数会有什么样的结果?

void Test (void)
{
	  char *str = (char *)malloc(100);
    strcpy(str,"hello");
    free(str);
    if(str != NULL)
    {
        strcpy(str, "world");
        printf(str);
    }
}

 答:输出world

当分配空间的时候,分配的是堆空间,当对malloc进行free空间释放,指针仍然指向堆空间

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

答:

1、栈区内存是计算机自动分配和回收的,可以反复使用,堆区则需要手动分配和释放

2、栈区空间地址是向下增长的,堆区则是向上增长的

3、栈区空间容量小,但效率比堆区高

4、堆区平凡申请和释放会造成内存空间不连续,从而造成大量内存碎片

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

答:当我们手动分配空间的时候,需要手动释放,当我们没有释放时,这部分内存会一直占据内存资源,就会产生内存泄漏。

为了避免内存泄漏。我们需要在手动分配空间,并使用完成后,及时释放掉,为了避免分配空间的地址,我们需要避免直接对空间首地址进行操作,使用指针进行操作

为了避免指针越界。我们需要在定义指针时,对指针及时初始化,不随意使用函数返回的局部变量的指针,在使用完成后,及时对指针指空;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值