我问了这个问题:Pass array by reference using C。我意识到我的问题是在C中使用指针星。最后结果证明,这种方法适用于我的程序:
#include <stdio.h>
void FillArray(int** myArray)
{
*myArray = (int*) malloc(sizeof(int) * 2);
(*myArray)[0] = 1;
(*myArray)[1] = 2;
}
int main()
{
int* myArray = NULL;
FillArray(& myArray);
printf("%d", myArray[0]);
return 0;
}
到目前为止,每件事情都很好。然后,我修改了 FillArray()函数,如下所示,以获得更好的代码可读性:
#include <stdio.h>
void FillArray(int** myArray)
{
int* temp = (*myArray);
temp = (int*) malloc(sizeof(int) * 2);
temp[0] = 1;
temp[1] = 2;
}
int main()
{
int* myArray = NULL;
FillArray(& myArray);
printf("%d", myArray[0]);
return 0;
}
现在,我在printf行遇到以下运行时错误:
Trial.exe中0x773115de处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。
即使我不是C专家,修改它似乎也是合法的。但是,显然它不起作用。语法有点混乱吗?我在这里想念一下吗?
感谢您的有用答案,
Sait的。
答案 0 :(得分:5)
temp
会获得myArray
地址的副本,但是您会为malloc
分配一些temp
内存,因此原始分配毫无意义且没有持久性影响。然后,您可以修改malloc
ed内存,但这根本不会更改myArray
。要更改myArray
中的main
,您必须指定
*myArray = temp;
在FillArray
的末尾。
void FillArray(int** myArray)
{
int* temp;
temp = (int*) malloc(sizeof(int) * 2);
temp[0] = 1;
temp[1] = 2;
*myArray = temp;
}
做你想要的。
答案 1 :(得分:1)
您正在将malloc缓冲区分配给堆栈上的本地变量,然后在返回时泄漏该内存。你永远不会影响传递给函数的指针。
答案 2 :(得分:0)
int* temp = (*myArray);
temp
是一个局部变量。对它做出的任何修改都不会影响原作。
temp = (int*) malloc(sizeof(int) * 2); // Will not affect *myArray
或多或少像 -
void foo( int * ptr )
{
ptr = malloc( sizeof(int) );
}
int *a ;
foo(a); // Does `a` get allocated too ? NO.
答案 3 :(得分:0)
这对我有用:
#include <stdio.h>
void FillArray(int** myArray)
{
(*myArray) = (int*) malloc(sizeof(int) * 2);
(*myArray)[0] = 1;
(*myArray)[1] = 2;
}
int main()
{
int* myArray = NULL;
FillArray(& myArray);
printf("%d\n", myArray[0]);
printf("%d\n", myArray[1]);
return 0;
}
答案 4 :(得分:0)
int* temp = (*myArray);
这一行是问题的根本原因,让我们看看这一行。
它表示取消引用myArray
并将结果值分配给temp
int *
,并且由于myArray
是int **
,所以引用会产生int *
。但你不能取消引用一个没有指向任何地方的指针,因为当你传递myArray作为参数时它是NULL而当你做(* myArray)时它试图访问myArray指向的内存位置(这是没有的地方)因为myArray为NULL)因此访问冲突读取位置0x00000000,这意味着您正在尝试取消引用NULL指针。
除了以上内容之外,让我们看看你的代码在做什么 一开始就是这样的图片
myArray ======> NULL
第一行后
int* temp = (*myArray); //pointing temp to (*myArray)
因为myArray是NULL,临时点没有,因此新图片
myArray =======> NULL
temp =======> NULL
第2行 temp =(int *)malloc(sizeof(int)* 2);
分配两个整数的内存并指向新分配的内存,使图像变为
myArray =======> NULL
temp =======> [ ] [ ]
临时
指向的第一和第二内存位置上的下两行存储1和2 temp[0] = 1;
temp[1] = 2;
现在图片是
myArray =======> NULL
temp =======> [1] [2]
答案 5 :(得分:-2)
Malloc temp!