2011-06-07 112 views
1

该代码非常简单,但我抓住了结果。 我只是玩指针算术,并想打印出阵列 ,但我得到的数组加上3个数字。那3个额外的东西从哪里来?这段代码片段是如何工作的?

#include <stdio.h> 


int my_array[] = {1,3,5,6,73,343,34}; 

int *pointer_numeros; 

int main (void) { 
int i = 0; 
pointer_numeros = my_array; 

while(*pointer_numeros) { 

     printf("los numeros del array son %d\t %d\n\n", i++, *pointer_numeros++); 

      } 

      getchar(); 
      return 0; 

    } 
+0

就其本身而言,直到你把它插入一个止动元件基于指针的迭代将无法正常工作。在类似的笔记中,有没有人知道动态数组(你使用malloc分配的类型)如何以及在哪里存储它们的大小,以及静态数组为什么不存储它们的大小? – susmits 2011-06-07 21:20:13

+0

@susmits:它是实现定义的,但你可以想象'malloc'可以在第一个元素之前立即存储细节。静态数组不需要存储它们的大小! – 2011-06-07 21:35:39

回答

3

*pointer_numeros在数组末尾不计算为false;它将继续遍历内存直到它碰到内容为零的地址(但是这是未定义的行为)。

您可以按照其他人的建议,终止您的数组为零。但总的来说,你仍然会有一个问题:如果你的某些元素本身为零,该怎么办?

+0

好的,我找到了你,但是又有多少数字让它停止? – retarded 2011-06-07 21:15:53

+1

@retarded:它可能在任何地方。数组之外的内存通常是随机垃圾(或者可能是其他变量),所以它很大程度上是偶然的,如果它会找到一个0. – 2011-06-07 21:17:11

1

你的意思写:

int my_array[] = {1,3,5,6,73,343,34,0}; 

你的代码迭代直到它在数组中找到一个零。你的数组里没有零。当它看到的指针指向为0修复它像这样

+0

是的,但我读了C会自动在广告的末尾添加'\ 0'数组,还是只在char数组中? 。非常感谢 – retarded 2011-06-07 21:14:04

+2

只限于字符串。所以'char mystr [] =“hello”;'最后会有一个零,但是'char mystr [] = {'h','e','l','l','o'};''将不会。 – Nemo 2011-06-07 21:17:13

+0

完美,谢谢!说得通。所以我从这个简单的东西中学到了很多东西,包括最后的0,为什么它在给定的时间停止,发生在包含0的内存地址时发生,并且它仅用于字符串数组额外0加入。 – retarded 2011-06-07 21:43:22

0

你的循环才会停止:

int my_array[] = {1,3,5,6,73,343,34,0};