2012-11-23 5 views
0

루프의 calloc 구조체에 값을 계산하고 할당하는 데 사용되는 임베디드 시스템에 대해 다소 큰 코드를 작성했습니다. 코드에서 버그가 발생하여 격리하고 수정하는 데 시간이 걸렸습니다. 필요한 경우 내 경험을 공유하기 전에 다른 사람이 버그를 지적 할 수 있는지보고 싶습니다.루프 내에서 메모리 초기화 : 세그먼트 오류가 있음

선언 블록 :

int *arr; 
int i, num; 
printf("Enter number of elements: "); 
scanf("%d", &num); //Assume num>=0 
arr = calloc(num, sizeof(int)); 
if (arr == NULL) 
    return; 
i = num; 

호출에 예외 무료() 이유를 던질 것이다 다음 코드 블록/블록?

for (i; i > 0; i--) { 
    arr[num - i] = i; 
} 
free(arr); 

또는

while (i--) { 
    arr[num - i] = i; 
} 
free(arr); 
+1

그리고 두 번째 것은 비슷한 방법으로 충돌합니다 : 루프 상단에서'i == 1 '을하면'while' 조건이 성공하고'i'가 0으로 변경됩니다. 루프 본문은'arr [num-0]'에 다시 쓰려고 시도 할 것입니다. –

+1

루프가 멋지게 보입니다. 충돌이있는 완전한 예제를 게시 할 수 있습니까? (ideone, codepad, 뭐든지 좋아, 또는 단지 여기에) –

+0

@j_random_hacker : 그건 내가 처음에 생각한 것이지만, 루프는 괜찮아. – acjay

답변

2

for 노력이 간단한 while 루프

에서 올바른하지만 문제 :

for(i=0;i<num;i++) 
     arr[i]=i; 
    free(arr); 

    i=0; 
    while(i<num) 
     { 
     arr[i]=i; 
     i++; 
     } 
    free(arr); 
4

두 번째 루프

때문에

i == 10 그래서 첫 번째 과제는 arr[10 - 9] = 9입니다로 시작의 postdecrement의 문제가 발생

23, ; i 마지막 루프가 1에 도달하면 당신은 arr[10 - 0] = 0

을 얻고 배열 범위 밖에 쓸 할당을 유발이 같은 while 루프를 작성하는 경우 0..9

그것을 작동합니다

do 
{ 
    arr[num - i] = i; 
    printf("i = %d, num - i = %d, arr = %d\t", i, num - i, arr[num - i]); 
} 
while (--i); 
+0

@AndersK 당신이 맞습니다, 문제는 while 루프에 있습니다. 왜냐하면 i의 postdecrement 동작 때문입니다. for 루프에서 while 문에서 루프 문이 평가되는 동안 감소합니다. while 루프에서는 루프 문이 평가되기 전에 감소합니다. –

0

또 다른 문제는 사용자가 num에 음수 값을 입력하면 -1 또는 다른 음수 값이 True으로 계산되므로 while 루프가 무한대로 진행될 수 있다는 것입니다. i이 할당 된 메모리의 경계 (아래쪽 또는 위쪽)를 초과하면 세그먼트 화 오류가 발생할 수도 있습니다.

+0

내 잘못, 내가 num> = 0을 지정 했어야했다, 나는 내 코드에서 그 한계 검사를했지만 간결함을 위해 여기에 그들을 추가하지 않았다. –