C中指针星的用法

时间:2012-05-03 21:10:42

标签: c pointers

我问了这个问题: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的。

6 个答案:

答案 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 *,并且由于myArrayint **,所以引用会产生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!