C++中int &m 传参问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中int &m 传参问题?相关的知识,希望对你有一定的参考价值。

我不知道这个题怎么做, max(int a[],int n, int &m) 中第三个参数是什么意思,还有下面代码第21行怎么做。 max(int a[],int n, int &m) 与 max(int a[],int n, int *m)有什么区别》

&m是引用传参,其实和*m一样的,引用就是变量的别名,相当于一个变量有两个名字,用哪个都行
你的max函数没有返回值的,调用时写错了
max(a,n,m)就可以了,调用完成后,m保存的就是最大值了
参考技术A 那行代码改成max(a[N],n,m);
传入m的引用(m的别名),在函数中改变的就是main函数中的m。

指针和引用的区别是,程序为指针分配空间,不为引用分配空间。从某种意义上来说引用可以被认为是不能改变的指针。
实际上很多面向对象的语言都取消了指针而采用指针,因为很容易指向不安全的空间。
参考技术B &m是引用,也就是变量的地址,*m是指针,本身就是地址

C++ LPTSTR 到 int(但使用 atoi 的内存覆盖问题)

【中文标题】C++ LPTSTR 到 int(但使用 atoi 的内存覆盖问题)【英文标题】:C++ LPTSTR to int (but memory overwrite problem using atoi) 【发布时间】:2010-05-02 02:56:36 【问题描述】:

我有以下代码,m_edit 是一个 MFC CEdit(我知道我永远不会使用 MFC,但项目需要它)。

这是一个简单的循环,从文本编辑中获取文本,在获取第一行后将其转换为整数,然后将其存储在 m_y 向量中。

LPTSTR szTemp;
vector<int> m_y;
for(int i = 0; i < m_edit->GetLineCount(); i++)
  szTemp = s_y.GetBuffer(0); 
  m_edit->GetLine(i, szTemp); // get line text store in szTemp
  y = atoi(szTemp);
  m_y.push_back(y);
  szTemp = "";
  y = 0;
 

重要示例:假设 CEdit 有 6 个数字:

0 5 2 5 18 6

如果您使用 Visual Studio 的调试器,您会发现异常! 这是它显示的内容:

y = 0 y = 5 y = 2 y = 5 y = 18 y = 68

你看到了吗? szTemp 插入 atoi 时,返回数字 6,但连接最后一个数字的第 2 位!!!这就是我执行 szTemp = ""; 的原因,但问题仍然存在。另外,假设最后一个数字是 17(不是 18),那么这次调试器会说 y = 67,所以肯定是这个问题。

但是,Visual Studio 调试器,当您在此迭代期间将鼠标悬停在 szTemp 上时,它会在 szTemp 中显示“6”

我想在将它放入 atoi 之前将一个 \0 连接到 szTemp 中吗?如何轻松解决?

【问题讨论】:

【参考方案1】:

来自MFC CEdit::GetLine documentation:

备注: 复制的行不包含空终止字符。

所以你需要注意GetLine的返回值,以确定有多少字节被复制到缓冲区中,然后添加你自己的NUL终止符。

另外,我建议您传入缓冲区大小以确保您没有潜在的缓冲区溢出。

【讨论】:

这就是我上面使用的。显然,它的作用是获取 CEdit 的文本,并将其放入 CString,然后我使用 GetBuffer(0) 获取所有文本,以便为 LPTSTR 分配足够的内存。 CString s_y; m_edit->GetWindowText(s_y);问题是,我想是 NULL 终止符,但是如何添加自己的 null 终止符? strcat (well strcat_s) 似乎不起作用(崩溃)。你能展示一种有效的方法来编写解决方案吗? @Dexter:int n = m_edit-&gt;GetLine(i, szTemp); szTemp[n] = '\0';。另外,GetBuffer(0) 没有办法分配“足够的内存”,除非它有超能力,而且GetLine 没有办法知道缓冲区有多大,除非你告诉它。 @Dexter:另外,既然我知道s_yCString,我也不知道你认为GetBuffer(0) 是否安全。我在CString::GetBuffer 文档中没有看到任何表明它分配了anything 的内容。听起来您也在覆盖内存(尽管这是一个单独的问题)。 @Dexter: P.S.我希望你明白为什么你不能用strcat 添加一个 NUL 终止符。 strcat 怎么知道第一个字符串的结尾在哪里?即使有,第二个字符串也是空字符串,所以strcat 不会做任何事情。 是的,我在想这些函数比实际复杂得多。谢谢你,我会试一试,让你知道。【参考方案2】:

我认为你应该为 GetBuffer 指定一个缓冲区大小

例如

szTemp = s_y.GetBuffer(MY_MAX_STRLEN);

GetBuffer(0) 分配一个大小为 0 的缓冲区,因为 CString (可能)为空。

【讨论】:

我发现有人用过GetBuffer(0),我假设,当插入0时,它会从s_y中抓取整个字符串。 但是 CString 也不为空。所以我假设它通过使用 GetWindowText 分配了足够的内存(所以它会抓取所有数字并将其长度用作我认为的缓冲区) @Dexter:您没有从s_y 获取字符串。您正在从CEdit 控件中获取一个字符串并将其存储在s_y 的缓冲区中。 GetWindowText 和什么有什么关系? s_y 包含 CEdit 的整个文本(通过 GetWindowText)。然后我使用该缓冲区并通过 GetLine 插入部分,以便我可以单独划分它,另一种方法是使用 GetWindowText 然后在 \r\n 处拆分。

以上是关于C++中int &m 传参问题?的主要内容,如果未能解决你的问题,请参考以下文章

C++中二维数组传参的方法详解

简单的MyForeach

c++ const问题小记

C++二维数组函数传参问题

python中的“引用”和C++的引用

无法在 C++ 中声明动态二维数组 [重复]