关于两道笔试题的思考

1. 在32位机器上正确的输出是?

struct Node {
  bool val1;
  int val2;
  char str[1023];
};

Node* p = new Node();

std::cout << sizeof(p) << std::endl;
std::cout << sizeof(*p) << std::endl;

 

└─$ cat /proc/version
Linux version 6.1.0-kali5-arm64 (devel@kali.org) (gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP Debian 6.1.12-1kali2 (2023-02-23)

在64位机器上输出如下:

8
1032

第一个 sizeof(p) 是指针所指地址的大小,64位机器上为8字节。第二个为结构体的大小。

 

更改结构体中数据排放的顺序

struct Node {
  bool val1;
  char str[1023];
  int val2;
};

此时输出结构体的大小为1028。

 

更改如下

struct Node {
  // bool val1;
  int val2;
  char str[1023];
};

此时输出结构体的大小为1028。

 

由于字节对齐的缘故,计算所得的结构体的大小实际上是下面整个区域的大小。

 

2. 在map中删除值为100的所有元素

 

for (auto it : m) {
  if (it.second == 100) {
  m.erase(it.first);
}

 

上面这样写是错误的,正确的写法如下:

while (true) {
  bool found = false;
  for (auto it : m) {
    if (it.second == 100) {
      m.erase(it.first);
      found = true;
      break;
    }
  }
  if (!found) break;
}

 

 

posted @ 2023-03-27 22:11  Veritas_des_Liberty  阅读(29)  评论(0编辑  收藏  举报