是的,我读过这个问题&答案: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的。
答案 0 :(得分:10)
优先顺序无法按预期发挥作用。试试这些:
(*myArray)[0] = 1;
(*myArray)[1] = 2;
(注意:iostream
不是C.它是C ++。)
答案 1 :(得分:2)
您的问题是运营商优先级之一。
[]
运算符比*
运算符绑定得更紧,所以
*myArray[1]
与
相同*(myArray[1]).
这是错误的,因为顶级指针只有一个指针分配了足够的内存。你想要:
(*myArray)[1] = 2;
另一方面,没有充分的理由像你一样混合使用C和C ++。显然你在这里有C ++代码,所以更喜欢new
和delete
而不是malloc
和free
因为后两者没有考虑复杂对象的构造函数和析构函数。
答案 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;