2011-12-15 104 views
-1

动态数组我有一个代码,这些行C包括:与和困惑*和[]()在C

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

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

它的工作,但我想知道为什么,使用malloc我相信我创建动态数组或指针称为意甲是到目前为止我的知识是:

& returns the address 
* returns the content of the adress 

你们用[]固定的数组和使用指针()

通过测试&serie[i]似乎工作,但它不*serie(i)*serie[i]*serie我认为它不会。

有人可以解释我这些吗?

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

+0

最初的代码是* serie = rand()仍然不好,但我不知道为什么我从serie中删除*,对此抱歉。 – user1094566 2011-12-15 16:18:16

回答

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

+0

是的丹你是对的,它实际上就是这样* serie = rand()检查这个:http://stackoverflow.com/questions/8514049/time-h-works-in-c-not-in-c莫名其妙我删除,但我不希望我认为你是对的两次。 – user1094566 2011-12-15 16:16:57

0

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

0

这看起来可怕的破坏:

  1. serie=rand();一个整数(的rand()返回值)分配到一个整数指针,很难说是明智的或有效的事情。
  2. &serie[i]读取随机存储器,因为您用随机数覆盖了指针。
1
With fixed arrays you use [] and with pointers() 

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

要获得i的值:个元素的数组中的系列,你可以一次:

serie[i] 

*(serie + i) 
+0

谢谢Klas,是的,两个sintax都很好。 – user1094566 2011-12-15 16:26:48

1

FYI ...二线声明一个指向整数,并为整数分配空间。但是,由于这并没有被释放,所以内存泄漏了。

所分配的存储器是不是在所有的使用,因为serie稍后重新分配给一个随机存储器位置(记住,serie是一个指向一个int,不是int本身,所以兰特()被分配随机存储器地址)。

数组语法将指针取消引用值,正如星号一样。 serie是一个指向int的指针。 *serieserie[0]都是由serie指向的位置处的值。 serie[i]是位置i处的整数值,它不再是指针。

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