3

我问了一个问题:使用 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 专家,但进行这种修改似乎是合法的。但是,显然它不起作用。语法是不是有点混乱?我在这里想念什么吗?

感谢您提供有用的答案,

坐下。

4

6 回答 6

5

temp获得 的地址的副本myArray,但随后您将一些malloced 内存分配给temp,因此原始分配毫无意义并且没有持久效果。然后您修改malloced 内存,但这根本没有改变myArray。要更改myArraymain您必须指定

*myArray = temp;

在结束时FillArray

void FillArray(int** myArray)
{
     int* temp;
     temp = (int*) malloc(sizeof(int) * 2);
     temp[0] = 1;
     temp[1] = 2;
     *myArray = temp;
}

做你想做的事。

于 2012-05-03T21:15:02.267 回答
1

您将 malloc 的缓冲区分配给堆栈上的一个局部变量,然后在返回时泄漏该内存。您永远不会影响传递给函数的指针。

于 2012-05-03T21:14:25.187 回答
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.
于 2012-05-03T21:16:15.353 回答
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;
}
于 2012-05-03T21:21:33.840 回答
0
int* temp = (*myArray);

这条线是问题的根本原因,让我们看看这条线是什么。

它说取消引用myArray并将结果值分配给tempis an int *,并且由于myArrayis 和int **,取消引用将导致 a int *。但是您不能取消引用未指向任何位置的指针,因为当您将 myArray 作为参数传递时,它是 NULL 并且当您执行 (*myArray) 时,它会尝试访问 myArray 指向的内存位置(这是 no-where因为 myArray 是 NULL)因此访问冲突读取位置 0x00000000,这意味着您正在尝试取消引用 NULL 指针。

除了上面让我们看看你的代码在做什么开始的图片是这样的

myArray ======> NULL

第一行之后

int* temp = (*myArray); //pointing temp to (*myArray)

因为 myArray 是 NULL temp points no where 因此新图片

myArray =======> NULL
temp =======> NULL

第 2 行 temp = (int*) malloc(sizeof(int) * 2);

分配两个整数的内存并将新分配的内存指向临时,这样图片就变成了

myArray =======> NULL
temp =======> [ ] [ ]

接下来的两行将 1 和 2 存储在 temp 指向的第一个和第二个内存位置

 temp[0] = 1;
 temp[1] = 2;

所以现在的图片是

myArray =======> NULL
temp =======> [1] [2]
于 2012-05-03T21:37:25.610 回答
-2

分配之前的 Malloc 温度!

于 2012-05-03T21:12:44.120 回答