2017-11-10 9 views
0

malloc을 사용하여 선언 된 동적 크기 (사용자가 지정) 배열의 산술 평균 및 공분산을 계산하는 프로그램을 작성했지만 프로그램에서 didn 예상 출력을 인쇄하지 마십시오. 따라서 배열 내의 값을보기 위해 중단 점을 사용했는데 값이 변하지 않는다는 것을 알았습니다.동적으로 할당 된 배열의 값에 액세스하거나 변경할 수 없습니다.

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#include <math.h> 

void main() 
{ 
    int n; 
    printf("enter n: \n"); 
    scanf("%d", &n); 
    double sum = 0, m, spv; 
    double *x = (double *)malloc(sizeof(double)*n); 
    for (int i = 0; i < n; ++i) 
    { 
     scanf("%f", x[i]); 
     sum += x[i]; 
    } 
    m = sum/n; 
    printf("Mittel = %f\n", m); 
    sum = 0; 
    for (int i = 0; i < n; ++i) 
    { 
     sum += pow((x[i] - m), 2); 
    } 
    spv = sum/(n - 1); 
    printf("SPV = %f\n", spv); 
    free(x); 
    return; 
} 
+1

두 문제 둘 다 [* undefined behavior *] (https://en.wikipedia.org/wiki/Undefined_behavior)로 이어진다 : 첫 번째는 [ scanf'] (http://en.cppreference.com/w/c/io/fscanf)는 * 포인터 * 여야합니다. 두 번째는''% f "'가''float '을위한 것입니다. –

+0

scanf에서 &를 사용하십시오 ("% f", &x[i]); – rsp

+0

) "&"로 scanf 내에 코드를 작성했지만 실수로 삭제했습니다. 형식 지정자에 문제가있었습니다. 이제는 잘 작동합니다. –

답변

1

scanf("%f", &x[i]); 주소를 전달해야합니다.

또한 malloc의 반환 값을 확인하십시오. malloc의 결과를 전송하지 마세요.

읽는 중 double%lf입니다. 표준 (C99) (§7.21.6.9)

인수가 대응 변환 사양의 정확한 타입이 아닌 경우로서 당 scanf("%lf",&x[i]);

double *x = malloc(sizeof(double)*n); 
if(x == NULL){ 
    fprintf(stderr,"%s","Error in malloc"); 
    exit(1); 
} 

은, 동작이 정의되지 않는다. x[i] 대신 &x[i]로 표시 메모리 위치에 작성하려고합니다 &scanf를 사용하지를 들어

. 가비지 값이 포함되어 있으므로 메모리 위치가 부족하여 정의되지 않은 동작이 발생할 수 있습니다.

+0

감사합니다. scanf 내에서 "&"코드를 작성했지만 실수로 삭제했습니다. 형식 지정자에 문제가 있습니다. 이제는 잘 작동합니다. –

0

scanf

변경이

scanf("%f", x[i]); 

scanf("%f", &x[i]); 

및 그래 "%의 F"를 인수로 어드레스 기대 -> "%의 LF"