与&混淆*和[]()与C中的动态数组

时间:2011-12-15 15:56:38

标签: c arrays pointers

我在C中有一个代码,其中包含以下行:

int i;
int *serie = malloc(sizeof(int)); 

    for (i = 0; i <= 20; i++){
        serie=rand(); 
        printf("%d ",&serie[i]);/* *serie */
    }

它确实有效,但我想知道为什么,对于malloc,我相信我正在创建一个名为serie的动态数组或指针,到目前为止,我的知识是:

& returns the address
* returns the content of the adress

对于固定数组,您使用[]和指针()

通过测试&serie[i]似乎有效,但它不是*serie(i)*serie[i]*serie我认为它也不行。

有人能解释一下这些吗?

如果我想要打印内容,我不应该使用*代替&,我认为使用动态数组时,您使用的是[]而不是()所以它应该是*serie[i]不是&serie[i]

5 个答案:

答案 0 :(得分:5)

在此代码中,serie是指向整数的指针。带malloc()的行为其分配空间,以便设置或从*serie获取整数将起作用。循环似乎错误地将rand()(整数)的返回值设置为serie。在您当前的代码中,该特定行应该如下所示(但这不是您想要的):

*serie = rand();

因为rand()返回一个整数,而serie单独是一个指向整数的指针。但是,*serie是一个可以设置为的整数。

printf()中,您尝试访问serie作为数组,但这不起作用,因为您只分配了一个元素。好吧,它会起作用,但只适用于零元素。

如果您尝试设置并生成20个随机元素(但使用“动态”数组),您可能需要这样的内容:

int i;
// note allocating the proper number of elements
int *serie = malloc(sizeof(int) * 20);

// note starting at and going < 20 for 20 elements
for (i = 0; i < 20; i++) {
    serie[i] = rand();
    printf("%d ", serie[i]); // *(serie + i) will also work here
}

请注意,只要您使用方括号来访问元素,它就会取消引用它,就像*一样。因此serie[i]*(serie + i)功能相同。

答案 1 :(得分:1)

With fixed arrays you use [] and with pointers () 

不正确的。您可以对指针和固定数组使用相同的语法。

要获取数组系列中第i个元素的值,您可以编写:

serie[i]

*(serie + i)

答案 2 :(得分:1)

FYI ...第二行声明一个指向整数的指针,并为整数分配空间。但是,由于没有释放,因此内存泄漏。

根本没有使用分配的内存,因为serie稍后被重新分配到随机内存位置(记住,serie是指向int的指针,而不是int本身,所以rand( )正在分配随机存储器地址)。

数组语法取消引用指向值的指针,星号也是如此。 serie是指向int的指针。 *serieserie[0]都是serie指向的位置的值。 serie[i]是位置i的整数值,它不再是指针。

&serie[i]正在打印距离随机位置i整数的整数的地址。 *serie[i]尝试将指针取消引用两次,一次使用括号,再次使用星号,这可能不是您想要的。

答案 3 :(得分:0)

* serie只是serie [0]的另一个名字。 *(serie + 1)是serie [1]的另一个名字。它们都编译为相同的机器代码。使用任何使您自己的代码最具可读性。对象数组?使用 []。指向字符串的指针?使用*。

答案 4 :(得分:0)

这看起来非常糟糕:

  1. serie=rand();将一个整数(rand()的返回值)赋给一个整数指针,几乎不是一个明智或有效的事情。
  2. &serie[i]读取随机内存,因为你用随机数覆盖了指针。