我在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]
?
答案 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的指针。 *serie
和serie[0]
都是serie
指向的位置的值。 serie[i]
是位置i的整数值,它不再是指针。
&serie[i]
正在打印距离随机位置i
整数的整数的地址。 *serie[i]
尝试将指针取消引用两次,一次使用括号,再次使用星号,这可能不是您想要的。
答案 3 :(得分:0)
* serie只是serie [0]的另一个名字。 *(serie + 1)是serie [1]的另一个名字。它们都编译为相同的机器代码。使用任何使您自己的代码最具可读性。对象数组?使用 []。指向字符串的指针?使用*。
答案 4 :(得分:0)
这看起来非常糟糕:
serie=rand();
将一个整数(rand()
的返回值)赋给一个整数指针,几乎不是一个明智或有效的事情。&serie[i]
读取随机内存,因为你用随机数覆盖了指针。