我有一个int arr[5]传递给函数的数组fillarr(int arr[]):
int fillarr(int arr[])
{
for(...);
return arr;
}
Run Code Online (Sandbox Code Playgroud)
如果必须返回i,以下代码(func1())是否正确?我记得在某处读到返回对局部变量的引用时存在问题.它与func2()有什么不同?
int& func1()
{
int i;
i = 1;
return i;
}
int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}
Run Code Online (Sandbox Code Playgroud) 智能指针如何处理数组?例如,
void function(void)
{
std::unique_ptr<int> my_array(new int[5]);
}
Run Code Online (Sandbox Code Playgroud)
当my_array超出范围并被破坏时,整个整数数组是否会被重新声明?只回收了数组中的第一个元素吗?或者还有其他事情发生(例如未定义的行为)?
作为这个问题的后续行动:
从我所看到的,这应该按预期工作:
void greet(){
char c[] = "Hello";
greetWith(c);
return;
}
Run Code Online (Sandbox Code Playgroud)
但这会导致未定义的行为:
char *greet(){
char c[] = "Hello";
return c;
}
Run Code Online (Sandbox Code Playgroud)
如果我是对的,那么修复第二个问候语功能的最佳方法是什么?在嵌入式环境中?在桌面上?
即使知道由于以下剪辑而发生的事情,理解它是如何发生也会有所帮助.接下来是四个问题
鉴于:
int& foo()
{
int i = 1;
return i;
}
Run Code Online (Sandbox Code Playgroud)
并且知道在下面对名为i的本地的引用被解除引用到分配给intVal的temp并且本地i在foo()的末尾消失
int intVal = foo();
Run Code Online (Sandbox Code Playgroud)
第一个问题 - 在下面,表达式的右侧与上面相同,所以这是编译器看到左侧并且基于上下文知道不取消引用返回的引用的情况,而是用它初始化创建一个新的引用?
第二个问题 - 只有这一点使得本地i坚持在intRef在范围内?
int& intRef = foo();
Run Code Online (Sandbox Code Playgroud)
第三个问题 - bellow intPtr获取本地i的地址.那么,编译器是否使用赋值的上下文并决定不取消引用以在获取引用的地址之前获取值(而不是说获取包含去引用值的temp的地址)?
第四个问题 - 当intPtr在范围内时,本地i会不停?
int* intPtr = &foo();
Run Code Online (Sandbox Code Playgroud)