我在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]

最佳答案

在此代码中,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)在功能上是等效的。

10-08 15:51