使用 C 按引用传递数组

Pass array by reference using C

本文关键字:数组 按引用传递 使用      更新时间:2023-10-16

是的,我已经阅读了这个问题和答案:在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++代码,因此更喜欢newdelete而不是mallocfree,因为后两者不考虑复杂对象的构造函数和析构函数。

好:

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;