2014-02-10 3 views
0
#include <stdio.h> 
#define N 100 

int main() 
{ 
int n,c,d,a[N],b[N]; 

printf("Insert elements numbers in the array\n"); 
scanf("%d ", n); 

printf("Insert the elements in the array\n"); 

for (c = 0; c < n ; c++) 
scanf("%d", a[c]); 

for (c=n-1,d = 0;d < n; c--,d++) 
b[d]= a[c]; 

for(c = 0; c <n; c++) 
a[c] = b[n]; 

printf("The array inverted is\n"); 

for(c=0; c<n;c++) 
printf("%d\n",a[c]); 

return 0; 
} 

그 이유는 무엇입니까? 내가 값 (N < 100)과 함께 시도했지만 여전히 충돌, 나는 그것을 고칠 방법을 모르겠습니까? 누군가 나를 도와 줄 수 있니? 감사 !왜 충돌이 있습니까? (버퍼 오버플로)

+5

'는 scanf ("%의 D", N)', '&n);' –

+1

를 '는 scanf ("%의 D"이어야 [C] = b [n];'? – BLUEPIXY

답변

6

이 :

scanf("%d ", n); 

은 정의되지 않은 동작을 호출합니다. 번호가 저장해야하는 위치에 대한 포인터를 필요로 scanf(), 그것은해야한다 :

scanf("%d ", &n); 

같은 당신의 scanf() 통화의 나머지 간다. 또한 유효한 값을 포함하는 변수에 의존하기 전에 데이터를 읽는 데 성공했는지 확인하기 위해 반환 값을 확인해야합니다.

+1

+1은 성공을 위해 반환 값을 확인하도록 조언합니다. – kbshimmyo

3

scanf에는 실제 값이 아닌 쓸 주소가 필요합니다.

대신이 작업을 수행 :

scanf("%d", &a[c]); 
0

는 약 scanf 주소를 필요로했다 무엇. 그러나 이것 또한 무엇입니까?

for(c = 0; c <n; c++) 
    a[c] = b[n]; 

n 그렇게 b[n]를 호출하는 당신에게 (아마도 예고) 문제를 줄 것이다, 각 배열의 요소 수입니다. 컴파일러는 그런 종류의 범위를 벗어난 액세스에 대해 경고하지 않는 경향이 있습니다 (this post 참조).

난 당신이 a의 모든 요소에 하나 개의 값을 복사 어쨌든 ab을 복사하지 의도 의심,하지만 당신이 예상되는 입력 또는 출력이 무엇인지 선언되지 않았기 때문에 순전히 추측입니다.

0

왜 충돌이 발생합니까?

Wiki는 말한다 : 컴퓨터 또는 (예 소프트웨어 응용 프로그램이나 운영 체제) 프로그램이 제대로 작동을 멈 추면 컴퓨팅

충돌 (또는 시스템 충돌이)입니다. 흔히 이러한 오류가 발생한 후에 종료됩니다. 크래시보고 서비스가 크래시의 세부 사항을 문서화 할 때까지 담당 프로그램이 정지 된 것처럼 보일 수 있습니다. 프로그램이 운영 체제 커널의 핵심 부분 인 경우 전체 컴퓨터가 충돌하여 치명적인 시스템 오류가 발생할 수 있습니다. 이 동작을 "충돌"이라고합니다.응용 프로그램 충돌이 발생할

일반적인 오류는 다음과 같습니다

  • 읽거나 해당 응용 프로그램 (분할 오류)에 의해 읽기 또는 쓰기에 할당되지 않은 메모리 또는 x86 특정 (일반 보호 오류) 쓰기를 시도
  • 권한이 있거나 잘못된 명령어를 실행하려고 시도했습니다.
  • 액세스 권한이없는 하드웨어 장치에서 I/O 작업을 수행하려고 시도했습니다.
  • 시스템 호출에 잘못된 인수가 전달되었습니다.
  • 응용 프로그램이 액세스 권한이없는 다른 시스템 자원에 액세스하려고 시도했습니다 (버스 오류)
  • 잘못된 인수 (CPU 아키텍처에 따라 다름)가있는 기계 명령어를 실행하려고 시도했습니다 : denorms 또는 NaN에 대한 연산 등의 프로그램에서

값, 정렬되지 않은 주소에 메모리 액세스, 문

scanf("%d ", n); 

,536,
scanf("%d", a[c]); 

프로그램이 중단 될 수 있습니다. 다른 & 연산자 scanf 인수 전인 제안

같이

scanf("%d ", &n); 
scanf("%d", &a[c]);