我有以下代码.
#include <iostream>
int * foo()
{
int a = 5;
return &a;
}
int main()
{
int* p = foo();
std::cout << *p;
*p = 8;
std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)
而代码只是运行而没有运行时异常!
输出是 58
怎么会这样?本地变量的内存不能在其功能之外无法访问吗?
我需要清除一个基本概念.这段代码工作正常.有人可以解释一下,如果函数calDouble已经返回int的地址(引用),为什么我需要在main int*j =&calDouble(i)中进一步使用&运算符; 获取int的地址(引用)?谢谢.
int& calDouble(int x)
{
x = x*2;
return x;
}
int main(int argc, char *argv[])
{
int i = 99;
int *j = &calDouble(i);
system("PAUSE");
return EXIT_SUCCESS;
}
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) 我目前正在阅读关于C++的内容,并且我读到当使用返回引用时,我应该确保我没有返回对函数返回时将超出范围的变量的引用.
那么为什么在Add函数中cen通过引用返回对象并且代码正常工作?!
这是代码:
#include <iostream>
using namespace std;
class Cents
{
private:
int m_nCents;
public:
Cents(int nCents) { m_nCents = nCents; }
int GetCents() { return m_nCents; }
};
Cents& Add(Cents &c1, Cents &c2)
{
Cents cen(c1.GetCents() + c2.GetCents());
return cen;
}
int main()
{
Cents cCents1(3);
Cents cCents2(9);
cout << "I have " << Add(cCents1, cCents2).GetCents() << " cents." << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在Win7上使用CodeBlocks IDE.
这是家庭作业的一部分.
我试图在我的方法getLine中读取并返回一行文件.
char *getLine(FILE *input) {
char line[30];
if(fgets(line, sizeof(line), input)!=NULL)
{
return line;
}else{
return NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎与我所教的有关指针的工作有关,但是我无法删除警告消息warning: function returns address of local variable [enabled by default].这个警告指的是这条线return line;.我的作业要求编译时没有警告或错误.我不明白我做错了什么.
我发现的大多数帮助建议为文本行提供malloc-ing空间,但是我们还没有在课堂上讨论过这个问题,尽管我已经在另一个类中做了一些.这真的是最好的方法吗?如果是这样,我可以在节目的任何地方免费吗?
可能重复:
返回本地或临时变量的地址
add函数执行错误.它应该返回一个值而不是一个指针.当打印ans和*ans_ptr并且程序甚至给出正确的结果时,为什么没有任何错误?我猜z的变量已经超出范围,应该存在分段错误.
#include <stdio.h>
int * add(int x, int y) {
int z = x + y;
int *ans_ptr = &z;
return ans_ptr;
}
int main() {
int ans = *(add(1, 2));
int *ans_ptr = add(1, 2);
printf("%d\n", *ans_ptr);
printf("%d\n", ans);
return 0;
}
Run Code Online (Sandbox Code Playgroud) #include<iostream>
using namespace std;
int *p = NULL;
void
fun(void){
int i = 10;
p = &i;
}
int
main(void){
fun();
cout<<*p<<endl; //#1
cout<<*p<<endl; //#2
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为#1和#2输出相同,但为什么#1输出10和#2输出一个随机数?
#include <iostream>
int* retPointer()
{
int x=10; //same as auto int x =10;
return &x;
}
int main(int argc, char **argv)
{
std::cout<<"x="<<*retPointer()<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我返回一个指向要堆叠的局部变量的指针.当我在man()中打印此指针指向的值时,我应该得到一个seg-fault.当我从函数retPointer()返回时,变量x应该超出范围.因此,当尝试访问main()中的值时,我是否应该得到分段错误?我在这里错过了什么吗?
输出= x = 10
返回ref时是否为未定义的行为.到一个局部变量?
int & func(){
int x = 10;
return x;
}
int main() {
int &y = func();
cout << y << endl;
}
Run Code Online (Sandbox Code Playgroud)