9.15 数据结构作业1

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:数据段.data
b:.BSS段
c:栈区
d:数据段.data
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:.data段
g_iB:.BSS段
g_iC:.data段
iD:.data段
iE:栈区
iF:栈区
piG:栈区
iH:栈区
4.	有关内存的思考题 (山东山大电力技术有限公司,登虹科技,昆腾微电子)
void GetMemory(char *p)
{
		p =(char *)malloc(100);
}
void Test(void)
{
	  char *str=NULL;
    GetMemory(str);
    strcpy(str,"hello world");
    printf(str);
}
请问运行 Test 函数会有什么样的结果?

段错误,因为p指向的是申请的区域,而str是一个空指针,如果需要获取申请的地址应该传回*p的地址。

char * GetMemory(void)
{
		char p1[] = "hello world"; //char *p = "hello world"
     return p1;
}
Void Test(void)
{
		char *str=NULL;
     str = GetMemory();
     printf(str);
}
请问运行 Test 函数会有什么样的结果?

段错误,p1是一个局部变量存储在栈中,当函数结束时释放内存,所以返回的p1是一个野指针。

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);
}
请问运行 Test 函数会有什么样的结果?

会输出"hello world",但是没有释放内存。

void Test (void)
{
	  char *str = (char *)malloc(100);
    strcpy(str,"hello");
    free(str);
    if(str != NULL)
    {
        strcpy(str, "world");
        printf(str);
    }
}
请问运行 Test 函数会有什么样的结果?

段错误,释放str的内存后,str != NULL仍然成立,strcpy(str, "world")是在操作已释放的内存是未被定义的行为。
5.	堆和栈的区别是什么? (矩阵软件)
管理分配效率不同,堆是手动申请释放,栈是电脑自动分配。
空间大小不同,堆是向高地址扩展,且不连续;栈是向低地址扩展,连续。
增长方向不同,堆是向上增长;栈是向下增长。
6.	什么是内存泄漏?面对内存泄漏和指针越界,你有哪些方法?(山大华天,智洋创新)
内存泄漏是没有适时释放申请的内存空间,未释放的内存一直占用资源。
内存泄漏解决方法:
1.及时释放申请的空间。
2.合理设计算法,避免内存无限增长。
3.设置合理的变量(作用域),减少内存占用。
指针越界解决方法:
1.数组越界:确保访问的索引在数组的有效范围内。
2.动态内存分配越界:确保访问的内存地址在分配的范围内,并在使用后释放内存。
3.指针运算越界:在进行指针运算时,确保结果指针仍然指向有效的内存区域。
4.字符串操作越界:使用字符串操作函数时,如 strncpy、strncat,确保目标缓冲区足够大。
5.检查指针有效性:在使用指针前检查其有效性,并在释放内存后将指针置为NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值