使用 C 按引用传递数组
Pass array by reference using C
是的,我已经阅读了这个问题和答案:在C中通过引用传递数组?。我有一个类似的问题,并从这个问题中实现了同样的想法。
但是,我仍然从以下代码中收到错误:
#include <iostream>
void FillArray(int** myArray)
{
free( *myArray ) ;
* myArray = (int*) malloc(sizeof(int) * 2);
*myArray[0] = 1;
*myArray[1] = 2;
}
int main()
{
int* myArray = NULL;
FillArray(& myArray);
return 0;
}
在 FillArray 函数结束后,我立即收到以下运行时错误:
程序.exe 0xC00000005中0x773115de时未处理的异常:访问冲突写入位置0xcccccccccc。
我正在使用Visual Studio,打开Visual C++ Empty Project。以及名为 main.cpp 的文件。这是否意味着它是用编译器而不是 C 编译器编译C++?如果是这样,我如何打开一个仅编译 C 编译器的文件?我尝试使用 main.c 重命名 main.cpp,但仍然遇到同样的问题。(我问这个问题,因为我读了一些关于"通过引用传递"的内容,并看到它在 C 和 C++ 中是不同的。
对不起,这个非常基本的问题。
我将不胜感激任何帮助,
赛特。
优先级
没有按预期工作。试试这些:
(*myArray)[0] = 1;
(*myArray)[1] = 2;
(注意:iostream
不是C,而是C++。
您的问题是运算符优先级问题之一。
[]
运算符比*
运算符绑定得更紧密,因此
*myArray[1]
与
*(myArray[1]).
这是错误的,因为顶级指针只为一个指针分配了足够的内存。 你想要:
(*myArray)[1] = 2;
附带说明一下,没有充分的理由像您那样混合 C 和 C++。 显然,您在这里有C++代码,因此更喜欢new
和delete
而不是malloc
和free
,因为后两者不考虑复杂对象的构造函数和析构函数。
好:
int main()
{
int* myArray = NULL;
FillArray(& myArray);
...
好:
void FillArray(int** myArray)
{
* myArray = (int*) malloc(sizeof(int) * 2);
灾难性的坏:
void FillArray(int** myArray)
{
free( *myArray ) ;
* myArray = (int*) malloc(sizeof(int) * 2);
...
更好:
void FillArray (int** myArray)
{
if (myArray)
free (*myArray);
*myArray = (int*) malloc(sizeof(int) * 2);
...
也:
*(myArray[0]) = 1;
*(myArray[1]) = 2;
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 将对象数组的引用传递给函数
- 使用对const结构的const数组的引用进行构造
- 使用引用与指针将数组作为参数传递
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 将 char 指针传递给接受对 char 数组的引用的函数
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 将数组作为引用传递到函数中不起作用
- 将数组从 Fortran 传递到C++时未定义的引用
- 将对静态存储 cstyle 数组的引用从 constexpr 函数传递到另一个 constexpr 函数
- 按引用传递数组并修改值C++
- 通过对象数组的引用传递
- 使用模板将数组作为引用作为参数传递
- C++数组通过引用传递,但如何理解这一点
- 使用 C 按引用传递数组
- 在C++中,按值传递数组和引用传递数组之间的差异
- 在函数中传递数组作为引用参数
- 将数组作为引用传递
- 为什么我们不能传递数组按值运行?
- c++中二维数组中引用传递的问题