首先这里有一个计算机分配内存的概念.
如下:
注意:一般情况下内存都是连续开辟.
一次性开辟了4个空间 a1,b2,c2,d2 输出他们的地址看一下.
int main(){
int a1 = 5, b2 = 10, c2 = 15, d2 = 20;
printf("a1......%p\n",&a1);
printf("b2......%p\n",&b2);
printf("c2......%p\n",&c2);
printf("d2......%p\n",&d2);
int * p3 = &b2;
printf("p3......%d\n",*p3);//输出 本身指向的值
printf("p3......%d\n",*(p3+1));//指向 a1
printf("p3......%d\n",*(p3-1));//指向 c2
return 0;
}
代码生成图:
我们先来看下面的一段代码和相关问题
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在哪里?____
pChar3在哪里?____ ptr1在哪里?____
2. 填空题:
sizeof(num1) = ____; 40
*char2在哪里?___ *pChar3在哪里?____ *ptr1在哪里?____
sizeof(char2) = ____; 5 strlen(char2) = ____; 4
sizeof(pChar3) = ____; 4 strlen(pChar3) = ____; 4
sizeof(ptr1) = ____; 4
内存区域:栈、堆、全局区、常量区、代码区
A. 把高级语言翻译成机器语言
B. 把高级语言翻译成汇编语言
C. 把中间代码变换成依赖具体机器的目标代码
D. 把汇编语言翻译成机器语言
正确答案:
C
答案解析
源代码-->预处理-->编译-->优化-->汇编-->链接–>可执行文件
汇编阶段把汇编语言代码/中间代码翻译成目标机器指令。
对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。(代码生成阶段)
代码生成阶段的主要任务是把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码,它的工作有赖于硬件系统结构和机器指令含义。选项C正确。
#include
int main(){
long long a = 1, b = 2, c = 3;
printf("%d %d %d\n", a, b, c);
return 0;
}
A. 1,2,3
B. 1,0,2
C. 1,3,2
D. 3,2,1
正确答案
B
答案解析
注:
printf()是一个库函数,C,C++中函数的参数是从右往左入栈的;从左往右出栈
栈的生长方向是从高往低的
小端模式是低位存储在低字节
%d格式输出的是4个字节大小,而long long为8个字节
所以,a=1,b=0,c=2
#include
char *myString()
{
char buffer[6] = {0};
char *s = "Hello World!";
for (int i = 0; i < sizeof(buffer) - 1; i++)
{
buffer[i] = *(s + i);
}
return buffer;
}
int main(int argc, char **argv)
{
printf("%s\n", myString());
return 0;
}
A. Hello
B. Hello World!
C. Well
D. 以上全部不正确
正确答案: D
答案解析