我在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)
在功能上是等效的。