int a[5]={1,2,3,5,6};
int *apnt= a;
while (*apnt)
{
printf("The no is %d\n",*apnt);
apnt++;
}
与å—符串ä¸åŒï¼Œæˆ‘知é“数组末尾没有nullå…ƒç´ ã€‚ä½†æ˜¯ï¼Œæ— è®ºåˆ·æ–°å†…å˜å¤šå°‘次,或é‡æ–°å¯åŠ¨xcode,我的代ç 总会æ供以下输出。这里å‘生了什么?有人å¯ä»¥ç»™æˆ‘一个è§è§£å—?
输出结果为:
The no is 1
The no is 2
The no is 3
The no is 5
The no is 6
The no is 32767
The no is 144723190
The no is 1694538263
The no is 1606416704
The no is 32767
The no is -1982110263
The no is 32767
ç”案 0 :(得分:1)
读å–数组的末尾是undefined behaviorã€‚ä½ æ‰€çœ‹åˆ°çš„ï¼Œå³ä½¿ä½ çœ‹åˆ°äº†ä»€ä¹ˆï¼Œä¹Ÿæ— æ³•ç”¨C ++è¯è¨€è§„则预测。
ä½ å¶ç„¶å¾—到这个输出,它å¯èƒ½åœ¨æ¯å°æœºå™¨ä¸Šéƒ½æœ‰æ‰€ä¸åŒï¼Œå³ä½¿æ˜¯æ¯æ¬¡è¿è¡Œä¹Ÿæ˜¯å¦‚æ¤ã€‚ Here它åšäº†åˆ«çš„事情,但它确实å¯ä»¥å®Œå…¨ä»»ä½•äº‹æƒ…。
ç”案 1 :(得分:1)
我认为其他的回ç”è€…è¯¯è§£äº†ä½ çš„é—®é¢˜çš„æ„图 - 我å‡è®¾ä½ ä¸æ˜¯è¯•å›¾åœ¨C ++ä¸æ‰¾åˆ°æœªå®šä¹‰çš„行为,åªæ˜¯æƒ³è¿ä»£ä½ 的数组。您的代ç ä¸çš„问题是,您ä¸æ–将指针apnt
递增超过数组的末尾。这是未定义的行为,任何事情都å¯èƒ½å‘生。
但是,通常在这ç§æƒ…况下会å‘生什么,您将继ç»è¯»å– {/ 1}}数组之åŽçš„内å˜ï¼ˆå‡½æ•°ä¸çš„其他局部å˜é‡ï¼‰ã€‚这就解释了为什么“乱ç â€è¾“出是å¯é¢„测的。您应该åªè¿ä»£æ•°ç»„ä¸çš„å…ƒç´ æ•°é‡ï¼ˆä¾‹å¦‚,使用for循环),或者您å¯ä»¥åœ¨æ•°ç»„çš„æœ«å°¾æ·»åŠ â€œ0â€ï¼Œå› æ¤while循环将终æ¢ã€‚