小编mor*_*imn的帖子

'const' 限定符何时保证变量是常量表达式?

据我所知,constC++中的限定符基本上声明了内部链接,有时它允许将变量用作常量表达式,以便将其放入数组边界、切换案例等。

但显然情况并非总是如此,我对const和的正确用法一无所知constexpr

具体来说,我发现当在数组边界中使用 const 限定数组的元素时,它不会被视为常量表达式,如下面的代码所示。

const int N = 3;
int foo[N] = {1, 2, 3};  // Valid

const int bar[5] = {1, 2, 3, 4, 5};
int arr[bar[2]] = {1, 2, 3};  // Invalid because a VLA can't be initialized
Run Code Online (Sandbox Code Playgroud)

在后面的部分使用constexpr而不是const解决问题。但是为什么最后一条语句无效呢?究竟需要什么才能使表达式保持不变?

c++ constant-expression constexpr

23
推荐指数
1
解决办法
1144
查看次数

void* 与 char* 具有相同的表示和内存对齐方式是什么意思?

我一直在阅读一些有关void*类型指针的文章,并从标准中发现了这一要求。

6.2.5.27:

指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。39) 类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。

我看到标准不保证所有指针类型具有相同的长度,所以这里的底线是指针void*具有相同的长度和对齐规则char*,对吗?

我不明白的是脚注 39),它说

相同的表示和对齐要求意味着作为函数参数、函数返回值和联合成员的可互换性。

我的问题是:

  1. “互换性”是什么意思?它是否说函数的参数和返回值void* Func(void*)都可以是char*

  2. 如果是这样,它是编译器进行的隐式转换吗?

  3. 那么工会成员又是什么呢?我实在不明白这句话的意思。谁能给我一个简单的例子吗?

c void-pointers language-lawyer

5
推荐指数
1
解决办法
552
查看次数

当我唯一关心的是大小时,使用全局变量而不是 malloc() 是否有缺点?

根据我的理解,动态分配比声明局部变量更可取

  1. 与堆栈大小相比,您需要分配大量数据,和/或
  2. 你想动态控制它的持续时间。

但是 AFAIK 全局变量分配在数据段上,与堆栈相比也相当大。假设我有一个很大的变量,它的生命周期将贯穿整个程序,并且关注的只是它的大小。全局声明它而不是调用它还有什么缺点malloc吗?

人们经常警告说全局变量是邪恶的,因为它们使代码变得复杂和不清楚,但我认为我不应该关心这一点,因为在我的情况下文件范围很小。

c malloc global-variables dynamic-memory-allocation

4
推荐指数
1
解决办法
69
查看次数

读取未初始化的 malloc() 内存是否会调用未定义的行为?

我知道这是一个非常基本的问题,可能有重复,但我找不到这个特定问题的严格答案,该问题涉及标准。(我看到有人说是UB,有人说不是)

如果我分配一块内存而不向其中填充数据,

int* ptr = malloc(10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

然后尝试读取它,那里的值将是垃圾。

但这是否被归类为未定义行为?或者它只是糟糕但至少不是UB?

c malloc undefined-behavior

0
推荐指数
1
解决办法
105
查看次数