【发布时间】:2021-07-07 03:17:56
【问题描述】:
typedef struct test{
char c_arr[1];
} test;
test array[1] = {{1}};
test get(int index){
return array[index];
}
int main(){
char* a = get(0).c_arr;
return *a;
}
在这篇文章中,行为是用 C++ 解释的:Accessing an array within a struct causes warnings with clang
使用gcc 或clang 编译时,上述代码不会导致任何警告或错误。
get(0).c_arr 是否返回一个指向在表达式末尾被销毁的临时变量的指针?如果是这样,是否取消引用并返回其值 UB?如果是这样,那么修复它的好方法是什么,也许是这个?
test* get(int index){
return &array[index];
}
【问题讨论】:
-
它不使用临时(正确地自动)变量;
array具有静态存储分配;并且index从中计算的事实不会改变其分配。它从此计算复制到本地(匿名)位置以引用 c_arr,并没有改变。但是,您正走在危险的道路上;如果您的函数返回a而不是*a,那么它会做错事。 -
@mevets 当
get通过值返回struct test时,为什么array具有静态存储分配很重要? -
我在这里很困惑,在 C++ 中这是一个临时变量,但在 C 中不是?什么规则使这种差异发生?
-
@DavidC.Rankin 进行实验来证明或反驳 UB 的问题是,UB 的一种表现形式是完全按照您在没有 UB 时所期望的方式工作。所以实验不会证明什么。
-
呃,等等,很可能是我。函数返回到
array的元素(不是array中的地址)。现在我看到了问题出在哪里(为什么没有理智的人会这样编码)所以问题是您正在分配基于函数返回本身的c_arr(指向第一个元素的指针)的地址。 (它确实使用了一个真正的临时地址来提供地址——该死的是我:)
标签: c