2013-12-03 31 views
2

我有这样的功能:打印一个数组,不知道大小

int printArray(int* arr, int size) { 

    int i = 0; 
    while (size--) { 
     printf("%d, ", *(arr + i++)); 
    } 

    return EXIT_SUCCESS; 
} 

我怎样才能打印阵列,而不使用大小参数?

L.E.我试图做这样的事情:

int printArray(int* arr) { 

    int i = 0; 
    while (*(arr + i)) { 
     printf("%d, ", *(arr + i++)); 
    } 

    return EXIT_SUCCESS; 
} 

但每个输出后跟三个未知值:(:1 2 3 4; :1 2 3 4 343443 -432244 324333)。

谢谢!

+1

Dunno。一般来说,你不能。您的整套数据中是否存在可用作定点的非法值? -1,也许? –

+1

你为什么要这样? – 2013-12-03 18:38:40

+1

'while(*(arr + i)){...}'是一个缓冲区溢出 - 您正在读入不适合您的内存,并且只有当'arr + i'碰巧指向值' 0'! –

回答

2

你可以通过在地址到最后一个元素:

int printArray(int* arr, int* end) { 

    do { 
     printf("%d, ", *arr); 
    } while((arr++) != end); 

    return EXIT_SUCCESS; 
} 
1

添加一个定点值。你知道的价值永远是最后一个。整数,但-1和0是最喜欢的值。

+2

'INT_MAX'(或'INT_MIN')也是一个选项。 – Kninnug

1

阵列仅仅是一系列连续的存储单元的。为了遍历一个数组,你需要知道两件事情,即起始地址和如何找到结尾。

寻找到底能在几个方面来完成,你需要给予:

  1. 结束地址明确
  2. 阵列
  3. 用来标记结束警戒值的长度的序列

在第一次尝试中,printArray(int* arr, int size)正在使用第二种机制,并从开始到结束递增内存位置。

您的第二次尝试printArray(int* arr)只是声明“打印直到找到0”。如果你有一个字符串(一个char数组以空终止符结束),这个想法可以正常工作,但是你有一个数组ints。不能保证0在那个列表中,所以你只会继续阅读越来越多的内存位置,直到最后一个为0。

编写一个程序非常类似于正常的人类思维过程。简单阅读你的代码,看看它是否有意义:

int in[4] = {1, 2, 3, 4}; // I have an array called in, it has 4 numbers: 1, 2, 3, 4 
int ret = printArray(in); // I pass that array to the function printArray 

... 
while (*(arr + i)) {  // while the contents of the memory location (array + i) is 
          // not 0, print the value we find there 

突然间变得非常明显,为什么这是行不通的。你的数组是否包含数字0?不...所以什么时候停止打印?

相关问题