그래서 오늘 C에서 삽입 정렬 알고리즘을 구현하고 있었고 THIS (video) 이상한 버그로 자신을 발견했습니다.변수 임의로 변경되는 값
정수 변수 arraySize는 루프 중에 자체 값을 변경하기 만하면 매번 발생하지 않으며 완벽하게 무작위이며 arraySize 값을 변경할 때만 초기화 할 때 코드 시작 부분에 있습니다. 값 10
코드 :이 정확한 프로그램이 출력
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int y = 0, arraySize = 10, array[1000];
srand(time(NULL));
for (int i = 0; i < arraySize; i++) {
array[i] = rand() % 1000;
}
for (int i = 1; i < arraySize; i++) {
for (int j = i; array[j] <= array[j - 1]; j--) {
y = array[j - 1];
array[j - 1] = array[j];
array[j] = y;
}
printf("for externo i = %d, arraySize = %d \n", i, arraySize);
}
for (int i = 0; i < arraySize; i++) {
printf("%d. i = %d ", array[i], i);
}
printf("\n");
return 0;
}
예 준 - 나 간단한 "GCC의 insertionSort.c"
for externo i = 1, arraySize = 10
for externo i = 2, arraySize = 10
for externo i = 3, arraySize = 10
for externo i = 4, arraySize = 5
10. i = 0 22. i = 1 233. i = 2 343. i = 3 592. i = 4
for externo i = 1, arraySize = 10
for externo i = 2, arraySize = 10
for externo i = 3, arraySize = 10
for externo i = 4, arraySize = 10
for externo i = 5, arraySize = 10
for externo i = 6, arraySize = 10
for externo i = 7, arraySize = 10
for externo i = 8, arraySize = 10
for externo i = 9, arraySize = 10
54. i = 0 239. i = 1 312. i = 2 313. i = 3 438. i = 4 465. i = 5 827. i = 6 839. i = 7 874. i = 8 935. i = 9
for externo i = 1, arraySize = 10
for externo i = 2, arraySize = 10
for externo i = 3, arraySize = 10
for externo i = 4, arraySize = 10
for externo i = 5, arraySize = 10
for externo i = 6, arraySize = 10
for externo i = 7, arraySize = 10
for externo i = 8, arraySize = 10
for externo i = 9, arraySize = 6
10. i = 0 58. i = 1 135. i = 2 316. i = 3 411. i = 4 442. i = 5
로 컴파일 된 후3210
xubuntu 16.04를 사용하고 있습니다. gcc 구성입니다.
내장 사양 사용. COLLECT_GCC = GCC COLLECT_LTO_WRAPPER =/USR/LIB/GCC/x86_64에-리눅스 GNU 대상/5/LTO-래퍼 : ../src/configure -v --with-pkgversion : x86_64에-리눅스 GNU 함께 구성된 = 'Ubuntu 5.4.0-6ubuntu1 ~ 16.04.4'--with-bugurl = file : ///usr/share/doc/gcc-5/README.Bugs --enable-languages = c, ada, C++, java/lib/lib/lib/lib/lib/lib/lib/lib/lib/lib/lib/-libdir =/usr/lib --enable-nls --with-sysroot =/--enable-clocale = gnu --enable-libstdcxx-debug - libstdcxx-time = yes --with-default-libstdcxx-abi = new - 사용 가능 -gnu-unique-object - 사용 불가 -vtable-verify - 사용 가능 -libmpx - 사용 가능 - 플러그인 --with-system-zlib - -disable-browser-plugin --enable-java-awt = gtk --enable-gtk-cairo --with-java-home =/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir =/usr/lib/jvm/java-1.5.0-gcj-5- amd64 - with-arch-directory = amd64 --with-ecj-jar =/usr/share/java/eclipse-ecj.jar - 사용 가능 -objc-gc - 사용 가능 -multarch - 사용 불가능 - werror --with-arch- 32 = i686 --with-abi = m64 --with-multilib-list = m32, m64, mx32 - enableable-multilib --with-tune = 일반 - 사용 가능 확인 = release --build = x86_64-linux- GNU --host = x86_64에-리눅스 GNU --target = x86_64에-리눅스 GNU 스레드 모델 : POSIX GCC 버전이 라인에서 5.4.0 20160609 (우분투 5.4.0-6ubuntu1 ~ 16.04.4)
누군가가 오류를 설명하기 위해 비디오를 게시 한 * 처음 * 시간이어야합니다. 그래서 축하해! –
for (int j = i; array [j] <= 배열 [j - 1]; j--)'이것은 범인입니다. –
'j'를 줄이면'j-1'이 0 이하로 떨어지지 않도록주의해야합니다. –