首先先来做两道题
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
static int staticVar = 1;
int localvar = 1;
int num1[10] = { 1,2,3,4 };
char char2[] = "abcd";
char* pChar3 = "abcd";
int* ptr1 = (int*)malloc(sizeof(int) * 4);
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}
1.选择题:
选项:A.栈 B.堆 C.数据段 D.代码段
globalvar在哪里 __ staticGlobalvar在哪里 __
staticvar在哪里 __ localvar在哪里 __
num1 在哪里 __
char2在哪里 __ *char2在哪里 __
pChar3在哪里 __ * pChar3在哪里 __
ptr1在哪里 __ * ptr1在哪里 __
2.填空题 :
sizeof(num1) = __;
sizeof(char2) = ___; strlen(char2) = _;
sizeof(pChar3) = ___; strlen(pChar) = ____;
先不要往下面看自己尝试着做一下,看能够做对几个,对自己学习检验。
知识点很多一定要细心看
1-3. globalvar在哪里 _C_ staticGlobalvar在哪里 _C_ staticvar在哪里 _C_ 考察点如下
通常考察的面试题:全局变量和static变量有什么区别?
全局变量,静态变量是放在数据段中(C语言的角度叫静态区),所以globalvar放在 C 中, staticGlobalvar放在C中, staticvar是局部的静态变量也是属于静态变量所以也放在C中, 他们三个有共同点是整个程序运行期间都在 ,区别是全局变量globalvar,静态变量staticGlobalvar在main函数之前会初始化且作用域是全局的在哪都能使用,局部静态变量staticvar会在运行到main函数再初始化且作用域是在Test函数中只能在Test函数中使用。而globalvar和staticGlobalvar的区别在于链接属性不一样,globalvar是所有文件中可见,而staticGlobalvar只在当前文件可见
4-5. localvar在哪里 _A_ num1 在哪里 _A_
localvar是声明的局部变量所以存在A(栈)中的,num1是一个局部声明的数组所以也存在A(栈)中的
6-11, char2在哪里 _A_ *char2在哪里 _A_ pChar3在哪里 _A_
* pChar3在哪里 _D_ ptr1在哪里 _A_ * ptr1在哪里 _B_
char2是声明在栈上的字符数组放入abcd+'\0'开了5个字节,所以也存在A(栈)中的,*char2是取地址所以取得是首字符的地址,这个数组存在局部所以也存在A(栈)中的,pChar3是一个指针变量也是一个局部变量所以也存在A(栈)中的,* pChar3中pChar3存的是一个字符串常量的地址,* pChar3指向这个地址的内容,所以* pChar3在D(代码段)中。ptr1在哪里在哪里非常容易混淆,大家会看后面开辟了空间所以会以为在堆中,ptr1是int* ptr只是=前面声明的一个局部变量的指针,所以也存在A(栈)中的, 而* ptr1指向的内容才是开辟出来的,所以是在B(堆)中
总结:
全局变量,静态变量是放在数据段中的,声明的局部变量、字符、字符数组(char*)、取地址(*ptr)存在栈中的,取地址指向的地址是开辟出来的就在堆中,不然就存在代码段中,
2.填空题 :
sizeof(num1) = _40_;
sizeof(char2) = _5__; strlen(char2) = _4__;
sizeof(pChar3) = _4、8__; strlen(pChar) = _4___; sizeof(ptr1)=___;
sizeof是计算字节数的
- sizeof(num1) 中num1[10] = { 1,2,3,4 };虽然只有4初始化,但是它开辟了10个整型所以是40个字节。
- sizeof(char2)中char char2[] = "abcd";是4个字节但是还有\0所以是5个字节。
- strlen(char2)中strlen是遇到\0结束所以是4个字节。
- sizeof(pChar3) 中char* pChar3 = "abcd";pChar3是一个指针,所以是4或8,区分32/64位。
- strlen(pChar)同样是遇到\0结束所以是4个字节。
- sizeof(ptr1)中int* ptr1 = (int*)malloc(sizeof(int) * 4);ptr1是一个指针,所以也是4或8,区分32/64位。
下面是图示说明: