gpt4 book ai didi

c++ - 访问结构中的数组会导致 clang 警告

转载 作者:行者123 更新时间:2023-12-04 00:48:58 35 4
gpt4 key购买 nike

struct test{
char c_arr[1];
};

test array[1] = {{1}};

test get(int index){
return array[index];
}

int main(){
char* a = get(0).c_arr;
return 0;
}

g++ 编译没有警告,但是用 clang++ 打印如下:

warning: temporary whose address is used as value of local variable 'a' will be destroyed at the end of the full-expression

这是不正确的吗? get(0).c_arr 不返回指向全局数组的指针吗?

或者 get(0) 是否返回一个临时变量并且编译器错误地认为 c_arr 只是它的一个实例,而不是全局变量?

编辑

为什么将此临时变量传递给函数时没有警告?

void call(char* in){}

int main(){
call(get(0).c_arr);
return 0;
}

最佳答案

get 按值返回,然后 get(0) 确实返回一个临时值,它在完整表达式后被销毁,留下 a悬空指针。

请注意,返回的临时test 是从array[index] 复制的,包括数组数据成员c_arra 应该指向临时 test 的数据成员数组 c_arr 的第一个元素,在完整表达式(即 ;char* a = get(0).c_arr;) 中整个临时 test (及其数据成员 c_arr ) 被销毁,然后 a 变为悬空状态。

如果 get 返回引用就没问题。

test& get(int index){
return array[index];
}

编辑

您添加的代码没问题。临时对象在完整表达式之后被销毁,即在 call(get(0).c_arr); 中的 ; 之后。传递给 call 的指针在 call 中仍然有效。

关于c++ - 访问结构中的数组会导致 clang 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68279358/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com