3

是的,我读过这个问题和答案: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++ 空项目。以及名为 main.cpp 的文件。这是否意味着它是用 C++ 编译器而不是 C 编译器编译的?如果是这样,我怎样才能打开一个只能编译 C 编译器的文件?我尝试用 main.c 重命名 main.cpp,但仍然有同样的问题。(我在问这个问题,因为我读了一些关于“按引用传递”的内容,发现它在 C 和 C++ 中是不同的。)

对不起这个非常基本的问题。

我将不胜感激任何帮助,

坐下。

4

3 回答 3

10

优先级没有按您预期的那样工作。试试这些:

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

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

于 2012-05-03T20:15:13.810 回答
2

您的问题是运算符优先级之一。

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

*myArray[1] 

是相同的

*(myArray[1]).  

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

(*myArray)[1] = 2;

附带说明一下,没有充分的理由像你一样混合 C 和 C++。很明显,这里有 C++ 代码,所以更喜欢一遍newdelete一遍mallocfree因为后两者没有考虑复杂对象的构造函数和析构函数。

于 2012-05-03T20:13:30.747 回答
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);
   ...

还:

   *(myArray[0]) = 1;
   *(myArray[1]) = 2;
于 2012-05-03T20:13:47.130 回答