2011-03-02 86 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); 
}