嵌入式笔试刷题(第7天)
C/C++ 综合笔试题 Part 1
1. 请写出下列代码中各变量的大小及存储位置
#define SIZE 1024
typedef struct _Node {
struct _Node *prev;
struct _Node *next;
unsigned char buf[SIZE];
char a;
int ib;
short header;
double *p;
unsigned char (*buf_ptr)[SIZE];
int (*fun[3])(char (*argA)(int, int), int);
} Node;
static double m = 2.1;
int data = 0;
int main(void) {
int *p = NULL;
p = malloc(sizeof(int));
char *buf = "helloworld";
static double m = 10.0;
Node *node = (Node*)malloc(sizeof(Node));
char buf_stack[10];
int i = 0;
extern int data;
free(p);
free(node);
}
存储分析:
(静态变量) | .data段 | 8字节 |
| .data段 | 4字节 |
| 栈 | 4字节 |
(字符串常量) | 只读段 | 指针 4字节,内容10字节 |
| 栈 + 堆 | 指针 4字节,结构体约1056字节 |
| 栈 | 10字节 |
| 栈 | 4字节 |
2. int i=(j=4,k=8,l=16,m=32); printf("%d", i); 输出是多少?
答案:
int i = (j = 4, k = 8, l = 16, m = 32); // 逗号表达式
逗号表达式返回最后一个表达式的值,即 m=32,因此 i=32,输出为:
32
3. 用递归方式写一个整数倒序输出函数
void print_reverse(int n) {
if (n == 0)
return;
printf("%d", n % 10);
print_reverse(n / 10);
}
示例调用:
print_reverse(1234); // 输出:4321
4. 求两个字符串的最长公共子串
char* longest_common_substring(const char* s1, const char* s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
int maxlen = 0, end = 0;
int dp[len1+1][len2+1];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i-1][j-1]+1;
if (dp[i][j] > maxlen) {
maxlen = dp[i][j];
end = i;
}
}
}
}
char *res = (char*)malloc(maxlen + 1);
strncpy(res, s1 + end - maxlen, maxlen);
res[maxlen] = '\0';
return res;
}
5. 下列试题的结果是什么?为什么?
#define SQR(X) (X*X) int a = 10; int k = 2; int m = 1; a /= SQR(k+m) / SQR(k+m);
分析:
宏 SQR(k+m) 展开为 (k+m*k+m) = 2 + 1*2 + 1 = 5,并非数学意义的平方,表达式变成:
a /= 5 / 5; // 即 a = a / 1
所以 a 结果仍是 10。
更多内容全在下方专栏
全网最受欢迎的嵌入式笔试专栏
笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学
3000+订阅还会涨价,提前订阅提前享受,持续更新中。
专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
#面试经验谈##嵌入式测试,嵌入式开发##嵌入式笔面经分享#
查看17道真题和解析