根据我的任务,我应该编写多文件程序,它必须接受int-作为数组长度和数组元素-作为Double.但当我try 输入3个或更多元素时,出现了一些问题.

我知道这与指针和Malloc函数有关,但我真的不知道问题出在哪里.

这是我的代码. 主要功能:

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

#include "../data_libs/data_io.h"
#include "data_process.h"

int main() {
    double *data = NULL;
    int n = 0;

    if (input(&data, &n) == 1) {
        printf("aboa\n");
        output(data, n);
        if (normalization(data, n)) {
            output(data, n);
            free(data);
        } else
            printf("ERROR=======\n");
    } else
        printf("ERROR+++++++\n");

    return 0;
}

Data_io.c中的输入和输出函数(&A):

#include "data_io.h"

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

int input(double **data, int *n) {
    if (scanf("%d", n) == 1) {
        printf("n is int\n");
        printf("n = %d\n", *n);
        (*data) = malloc((*n) * sizeof(double));
        for (int i = 0; i < *n; i++) {
            if (scanf("%lf", data[i]) != 1)
                return 0;
        }
        return 1;
    } else
        return 0;
}

void output(double *data, int n) {
    for (int i = 0; i < n; i++) {
        if (i == n - 1)
            printf("%lf", data[i]);
        else
            printf("%lf ", data[i]);
    }
}

Data_io.c的头文件data_io.h

#ifndef DATA_IO_H
#define DATA_IO_H

int input(double **data, int *n);
void output(double *data, int n);

#endif

推荐答案

data是指向单个double*的指针.当你做data[i]时,你请求的是double*数组中的第109double*,而你没有.您只有onedouble*,指向适合*ndouble的内存,所以只有data[0]个有效的取消引用.

在分配的内存中达到第101到第double位的一些替代方法:

*data + i
data[0] + i
&(*data)[i]
&data[0][i]

如果双指针让它变得很困难,你可以用*data来取消对data的引用,你知道的,它指向一个由double组成的数组,然后把它赋给一个临时变量,并在函数的其余部分使用它.示例:

*data = malloc(*n * sizeof(double));
double *tmp = *data;
for (int i = 0; i < *n; i++) {
    if (scanf("%lf", &tmp[i]) != 1) return false;
    //               ^^^^^^^
    // or just       tmp + i
}

C++相关问答推荐

ATTiny1606定时器TCA 0中断未触发

Tiva TM4C123GXL的I2C通信

正在try 将文件/文件夹名从目录 struct 存储到链接列表

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

LibpCap禁用监视器模式(C、MacOS)

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

在每种If-Else情况下执行语句的最佳方式

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

我在C程序的Flex/Bison中遇到语法错误

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

不带Malloc的链表

Fscanf打印除退出C代码为1的程序外的所有内容

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

使用共享变量同步多线程 C 中的函数

全局变量 y0 与 mathlib 冲突,无法编译最小的 C 代码

C11 嵌套泛型

`void foo(int a[static 0]);` 有效吗?

假设函数调用返回的 string(char *) 上有 free() 是否安全?