c语言内存的面试题,C语言内存面试题分析(干货).pdf

C 语言内存面试题分析(干货)

原文标题:C 语言内存面试题面试题

1. 内存中不同区域的识别

char c[] = "123";

c[0] = 'X';

由于字符串”123”是通过数组char c[]来分配内存,因此被分配在栈区

char *p = "123";

p[0] = 'X';

指针char *p可以指向任意类型的内存块, “123”被分配在文字常量区。而常

量区内存是不允许被修改的,因此执行p[0] = ‘X’会出现运行时错误

runtime error。

char *a = "hello";

char *b = "hello";

if(a b)

printf("YES");

else

printf("NO");

这题看起来比较简单,”hello”位于文字常量区,a和b都是指向它的地址,

应该是相等的。但这是编译器优化的情况,如果编译器没有优化,在文字常量

区建立了两个”hello”常量,那么就是两个不同的地址,a和b自然也就不相

等。

2. 栈区数据在函数返回时被销毁

char *func1()

{

char p[] = "hello world";

return p;

}

char *func2()

{

char *p = "hello world";

return p;

}

int main(int argc, char *argv[])

{

char *p = func1();

printf("%s\n", p);

p = func2();

printf("%s\n", p);

return 0;

}

先想象下两次打印的结果都是”hello world”吗?

函数func1中的字符数组p[]为函数内的局部变量,存储在栈区,在函数返回

后,内存已经被释放。func1返回的p指向的那一块内存已经被释放,可能被

写入了其他数据,此时通过printf(“%s\n”, p)来访问数据是非法的,结果

更是不可预知的,可能导致程序崩溃。

而func2中的”hello world”由于保存在文字常量区,因此在函数func2返回

后没有被销毁,可以正常打印出结果。

3. 函数调用中形参的传递

void GetMemory(char *s)

{

s = (char *) malloc( 10 );

strcpy(s, "abc");

printf("in func: s = %s\n", s);

}

int main(int argc, char *argv[])

{

char *str = NULL;

GetMemory(str);

printf("out func: s = %s\n", str);

return 0;

}

这里关键在于如何理解函数GetMemory中的形参char *s,函数在执行过程中

会将形参s入栈,为其分配内存空间,也就是说这里的s和调用时的

GetMemory(str)中的str完全不同,这里的s只不过是str的一个拷贝。

s是个指针,也就是个32位的unsigned int,只是保存了一个地址。在函数

GetMemory中调用malloc在堆上分配了内存,新分配内存的地址拷贝到s中,

但是并没有拷贝到原先的str中。因此指针str仍然没有指向新分配内存,所

以str并没有改变,打印的仍然是空值。

commet:这题需要好好理解下,许多初学者单纯地认为带了*的就是传入了指针

可以改变变量值

4.函数调用中形参入栈的顺序

void func(int a, int b)

{

printf("%d, %d\n",a,b);

}

int main(int argc, char *argv[])

{

int x = 10;

func( x, x++);

return 0;

}

输出什么???

·

A. (10, 10)

B. (10, 11)

C. (11, 10)

D. (11, 11)

·

函数执行时,首先建立栈区获得入口地址,然后将形

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值