c - 有关 scanf 和内存分配的帮助

标签 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 已关闭。另外,我如何能够通过引用传回我的值数组?我对此也感到非常困难。感谢大家。

最佳答案

而不是

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 未初始化。

关于c - 有关 scanf 和内存分配的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5165926/

相关文章:

c - 如何停止此 C 代码循环?

c - 不同的产品对

c - 二维数组和指针表示

c - 为什么 valgrind 提示单个链表节点删除时大小为 8 的无效读取?

php - PHP copy()如何处理内存

C 库从 BG 线程调用 kdb 函数

c - 如何将解压结构的内容复制到 __packed__ 结构?

c - 将指针数组作为 const 参数传递

c++ - 按引用传递指针未按预期工作

linux - 当操作系统终止您的进程时返回代码