帮助扫描和内存分配

时间:2011-03-02 10:09:39

标签: c pointers memory-management pass-by-reference 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;
}

我扫描了getdata中的值,但是我在垃圾中扫描。我很确定我的scanf已关闭。另外,我怎样才能通过引用传回我的值数组?我也很难过。感谢大家。

4 个答案:

答案 0 :(得分: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以来的虚假位置 没有初始化。

答案 1 :(得分:0)

我喜欢有对象&#34;已分配&#34;到一个单一的功能。在您的程序中,您的值是在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。

答案 2 :(得分:0)

也代替

printf(“%f”,值+ 2);

使用

printf(“%f”,*(值+ 2));

答案 3 :(得分: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);
}