मैं निम्नलिखित कार्यक्रम है:सरणी पूर्णांक वी के रूप में घोषित [100] लेकिन और (v [100]) कोई चेतावनी देता है
#include <stdio.h>
int main() {
int v[100];
int *p;
for (p = &(v[0]); p != &(v[100]); ++p)
if ((*p = getchar()) == EOF) {
--p;
break;
}
while (p != v)
putchar(*--p);
return 0;
}
और इस टर्मिनल पर gcc --version
के उत्पादन में है:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
क्यों एक सरणी के अंतिम के बाद तत्व का पता हो रही है मुझे कोई चेतावनी लेकिन उदाहरण के लिए हो रही है v[101]
का पता मुझे निम्न चेतावनी देता है देता है
test.c:8:29: warning: array index 101 is past the end of the array (which
contains 100 elements) [-Warray-bounds]
for(p = &(v[0]); p != &(v[101]); ++p)
^~~~
test.c:5:5: note: array 'v' declared here
int v[100];
^
1 warning generated.
,210
मुझे पता है कि अपरिभाषित व्यवहार है एक बफर के सीमा से बाहर अनुक्रमण तत्वों, तो क्यों संकलक पहले मामले के बारे में शिकायत नहीं है?
आपका प्रोग्राम * अपरिभाषित व्यवहार * का आह्वान करेगा यदि केवल ईओएफ से पहले शून्य अक्षर पढ़े जाते हैं। – MikeCAT
आपको 'EOF' पर' p' कम नहीं करना चाहिए। – chqrlie
@chqrlie आप यह कहते हैं क्योंकि निम्न में लूप में पहली बार 'पी' कम हो जाती है और फिर इसे अस्वीकार कर दिया जाता है? – nbro