2011-03-02 81 views
0

這裏是我的代碼:幫助scanf函數和內存分配

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

#define MAX 50 

float** getdata(void); 
void calculations(float* fPtr); 
//void printoriginal(float* values, int inputnum, float* fPtr); 

int main(void) 
{ 
    float** fPtr; 
    float* values; 

    fPtr = getdata(); 
    calculations(*fPtr); 
    int element; 
// printoriginal(*values, inputnum, *fPtr); 



    system("PAUSE"); 
    return 0; 
} 

float getvalues(void) 
{ 
    float* values = (float*)calloc(*inputnum, sizeof(float)); 

float** getdata(void) 
{ 
    int i; 
    int n; 
    float** fPtr; 
    int* inputnum; 

    printf("How many values do you want to input into the array?"); 
    scanf("%d", inputnum); 

    float* values = (float*)calloc(*inputnum, sizeof(float)); 

    if (values == NULL) 
    { printf("Memory overflow\n"); 
     exit(101); 
    } 


    for(i = 0; i < *inputnum; i++) 
    { 
     n = i + 1; 
     printf("Please enter your %d number: ", n); 
     scanf("%f",(values+i)); 
    } 


    fPtr = (float**)calloc(*inputnum+1, sizeof(float*)); 
    if (fPtr == NULL) 
    { printf("Memory overflow\n"); 
     exit(101); 
    } 

    for(int c=0; c < *inputnum; c++) 
    { 
     *(fPtr+i) = (values+i); 
    } 
printf("%f", values+2); 

return fPtr; 
} 

我SCANF中的GetData值,但我在垃圾掃描。林肯定我的scanf關閉了。另外,我將如何能夠通過引用傳回我的值數組?我也很難過。感謝大家。

回答

0

而不是

 
int * inputnum; 
scanf(..., inputnum); 

你想:

 
int inputnum; 
scanf(..., &inputnum); 

要麼,你需要插入inputnum的分配:

 
/* Very non-C-worthy code sample */ 
int * inputnum; 
inputnum = malloc(sizeof *inputnum); 
if(inputnum == NULL) { 
    perror("malloc"); 
    exit(EXIT_FAILURE); 
} 
scanf(..., inputnum); 

但看起來會很奇怪熟悉C 的人(除非有其他原因,並且在此 情況下,似乎沒有任何理由。)

您所遇到的問題是,scanf函數是 存儲在由inputnum指出 的位置,這是一個虛假的位置接收到的值,因爲inputnum 未初始化。

0

我喜歡將對象「賦值」爲一個單一的函數。在你的程序中,你的值是在函數getdata()中創建的,在calculations()中使用並且從未發佈。

如果main()函數對它們負責,那麼我認爲它會使編碼更容易。像

int main(void) { 
    int inputnum, innum; 
    double *fPtr; 

    printf("How many values do you want to input into the array?"); 
    fflush(stdout); 
    if (scanf("%d", &inputnum) != 1) { 
     fprintf(stderr, "Error in input. Program aborted.\n"); 
     exit(EXIT_FAILURE); 
    } 
    if (inputnum > MAX) { /* ... nothing yet ... */ } 

    fPtr = calloc(inputnum, sizeof *fPtr); 
    if (fPtr == NULL) { 
     fprintf(stderr, "Not enough memory. Program aborted.\n"); 
     exit(EXIT_FAILURE); 
    } 

    /* use fPtr in other functions */ 
    innum = data_get(fPtr, inputnum); 
    data_print(fPtr, innum); 

    free(fPtr); 
    return 0; 
} 

東西在上面的代碼片段,我使用的功能data_get()data_print()帶着幾分不同的原型比你。這些函數帶有一個指針和一些元素。

int data_get(double *data, int num); 
void data_print(double *data, int num); 

第一個讀取多達num雙打到內存data指出,並且返回有效的進入雙打的數量。
第二次打印雙打數。

哦!除非您有充分的理由使用float,否則請勿使用它們。始終更喜歡double s。

0

此外代替

的printf( 「%F」,值+ 2); printf(「%f」,*(values + 2));這個函數返回一個數組,

0

有這麼多的錯誤,我不知道從哪裏開始:)

下面的代碼完全重寫。請研究這個。

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

#define MAX 50 

int get_data  (float** array);   /* must be pointer-to-pointer to return through parameter */ 
void print_data  (const float* array, int size); /* print data */ 
void do_weird_things (float* array, int size); /* do weird things with the data */ 
void clear_data  (float* array);   /* clean up */ 

int main(void) 
{ 
    float* array; 
    int size; 

    size = get_data (&array); 

    printf("Before weird things:\n"); 
    print_data (array, size); 

    do_weird_things (array, size); 

    printf("After weird things:\n"); 
    print_data (array, size); 

    clear_data (array); 


    system("PAUSE"); 
    return 0; 
} 

int get_data (float** array) 
{ 
    int i; 
    int items; 

    printf("How many values do you want to input into the array? "); 
    scanf("%d", &items); 
    getchar(); /* remove \n from stdin */ 

    *array = calloc(items, sizeof(float)); 

    if (*array == NULL) 
    { 
     printf("Memory overflow\n"); 
     exit(EXIT_FAILURE); 
    } 


    for(i = 0; i < items; i++) 
    { 
     printf("Please enter your %d number: ", i+1); 
     scanf("%f", (*array) + i); 
     getchar(); /* remove \n from stdin */ 
    } 

    return items; 
} 

void do_weird_things (float* array, int size) /* do whatever data manipulation you wish here */ 
{ 
    int i; 

    for(i=0; i<size; i++) 
    { 
    array[i] += i; 
    } 
} 

void print_data (const float* array, int size) 
{ 
    int i; 

    for(i=0; i<size; i++) 
    { 
    printf("%f\t", array[i]); 
    } 
    printf("\n"); 
} 

void clear_data  (float* array) 
{ 
    free(array); 
}