使用C通过引用传递数组

时间:2012-05-03 20:10:54

标签: c++ parameters pass-by-reference

是的,我读过这个问题&答案:Passing an array by reference in 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函数结束后立即收到以下运行时错误:

  

Program.exe 0xC00000005中0x773115de处的未处理异常:访问冲突写入位置0xcccccccccc。

我正在使用Visual Studio,打开了Visual C ++ Empty Project。并且文件名为main.cpp。这是否意味着它是用C ++编译器而不是C编译器编译的?如果是这样,我怎样才能打开一个只会编译C编译器的文件?我尝试用main.c重命名main.cpp,但仍然有同样的问题。 (我问这个问题,因为我读了一些关于“通过引用传递”的内容,并发现它在C和C ++中有所不同。)

抱歉这个非常基本的问题。

我将不胜感激,

Sait的。

3 个答案:

答案 0 :(得分:10)

优先顺序无法按预期发挥作用。试试这些:

(*myArray)[0] = 1;
(*myArray)[1] = 2;

(注意:iostream不是C.它是C ++。)

答案 1 :(得分:2)

您的问题是运营商优先级之一。

[]运算符比*运算符绑定得更紧,所以

*myArray[1] 

相同
*(myArray[1]).  

这是错误的,因为顶级指针只有一个指针分配了足够的内存。你想要:

(*myArray)[1] = 2;

另一方面,没有充分的理由像你一样混合使用C和C ++。显然你在这里有C ++代码,所以更喜欢newdelete而不是mallocfree因为后两者没有考虑复杂对象的构造函数和析构函数。

答案 2 :(得分:1)

好:

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);
   ...

ALSO:

   *(myArray[0]) = 1;
   *(myArray[1]) = 2;