Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用c语言声明数组,不带初始大小_C_Arrays_Function - Fatal编程技术网

用c语言声明数组,不带初始大小

用c语言声明数组,不带初始大小,c,arrays,function,C,Arrays,Function,编写一个程序来处理温度细节,如下所示。 -输入要计算的天数主要功能 -以摄氏度为单位的输入温度–输入功能 -将温度从摄氏度转换为华氏度。-分离功能 -找到以华氏为单位的平均温度 如果没有数组的初始大小,如何制作此程序 #include<stdio.h> #include<conio.h> void input(int); int temp[10]; int d; void main() { int x=0; float avg=0,t=0; pri

编写一个程序来处理温度细节,如下所示。
-输入要计算的天数主要功能
-以摄氏度为单位的输入温度–输入功能
-将温度从摄氏度转换为华氏度。-分离功能
-找到以华氏为单位的平均温度

如果没有数组的初始大小,如何制作此程序

#include<stdio.h>
#include<conio.h>
void input(int);
int temp[10];
int d;
void main()
{
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
        t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
}
void input(int d)
{
    int x=0;
    for(x=0;x<d;x++)
    {
        printf("Input temperature in Celsius for #%d day",x+1);
        scanf("%d",&temp[x]);
    }
}
void conv()
{
    int x=0;
    for(x=0;x<d;x++)
    {
        temp[x]=1.8*temp[x]+32;
    }
}
#包括
#包括
无效输入(int);
内部温度[10];
int d;
void main()
{
int x=0;
浮动平均值=0,t=0;
printf(“\n天数:”);
scanf(“%d”、&d);
投入(d);
conv();

对于(x=0;x读取大小后在堆上动态分配“数组”。

在C中,数组和指针密切相关。事实上,通过设计,数组只是访问指向已分配内存的指针的语法约定。*(有关更多详细信息,请参阅下面的注释)

所以在C语言中

 anyarray[n] 

 *(anyarray+n)
使用指针算法

你真的不必担心细节就能让它“工作”,因为它的设计有些直观

只需创建一个指针,分配内存,然后像数组一样访问它

以下是一些例子--

请记住--如果您访问分配区域之外的区域,您将有未知的影响

  • 需要明确的是,索引运算符(
    []
    )被转换为指针算法。这不是现代意义上的数组 所涉及的指针是否指向(动态)分配的 内存对于该运算符的工作方式无关紧要。在更现代的语言中,您可以将数组作为抽象类型进行操作(例如,要查看它有多大),而在C语言中不能这样做

您需要将
temp
声明为
int
指针(而不是
int
数组)。然后,您可以在
main
中使用
malloc
(在第一次
scanf
之后):


如果您的编译器支持
c99
,则只需使用VLA(可变长度数组)。如下所示:

void input(int);

 int d;
 void main()
 {
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    int temp[d];
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
       t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
  }
void输入(int);
int d;
void main()
{
int x=0;
浮动平均值=0,t=0;
printf(“\n天数:”);
scanf(“%d”、&d);
内部温度[d];
投入(d);
conv();

对于(x=0;x没有初始大小的数组基本上只是一个指针。为了动态设置数组的大小,需要使用
malloc()
calloc()
函数。这些函数将分配指定数量的内存

在上面的代码中,将
temp
声明为int指针

int *temp;
然后使用
malloc()
calloc()
为其分配空间。这些函数的参数是要分配的字节数。在这种情况下,您需要足够的空间来容纳
d
int。因此

temp = malloc(d * sizeof(int));
malloc
返回指向刚刚分配的内存块中第一个字节的指针。常规数组只是指向一个分段内存块中第一个字节的指针,这正是
temp
现在的情况。因此,您可以将
temp
指针视为数组!如下所示:

temp[1] = 10;
int foo = temp[1];
printf("%d", foo);
输出

10

我没有改变任何东西,所以你可以看清楚

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>   //here
void input(int);
int *temp=0;  //here
int d;
void main()
{
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    temp=malloc(d * sizeof(int));  //here
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
        t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
}
void input(int d)
{
    int x=0;
    for(x=0;x<d;x++)
    {
        printf("Input temperature in Celsius for #%d day",x+1);
        scanf("%d",&temp[x]);
    }
}
void conv()
{
    int x=0;
    for(x=0;x<d;x++)
    {
        temp[x]=1.8*temp[x]+32;
    }
}
#包括
#包括
#包括//
无效输入(int);
int*temp=0;//此处
int d;
void main()
{
int x=0;
浮动平均值=0,t=0;
printf(“\n天数:”);
scanf(“%d”、&d);
temp=malloc(d*sizeof(int));//此处
投入(d);
conv();
对于(x=0;x1-在文件顶部添加
#包括
。然后修改conv()代码,如下所示:
2-修改temp声明如下(全局变量):

3-修改
输入(int d)
函数如下(在Visual Studio 2010上测试):

void输入(int d)
{
int x=0;
temp=(int*)malloc(sizeof(int)*d);

对于(x=0;x也许回答得晚了,但是。。。 如果使用小型嵌入式系统,则可能没有malloc和free函数。 因此,您必须为
366*sizeof(您的_类型)
牺牲内存,静态定义它并将其用作循环缓冲区。然后您可以始终按计算平均值所需的天数对其进行切片。
当然,这会产生自然约束。你可以自己定义。

为什么不首先分配具有所需大小的数组?@DrewMcGowen你是对的,我没有阅读代码,也没有看到大小被读取。更新的答案反映了这一点。你的编译器支持c99吗?1)#包括非标准头2)
void main()
main()应该返回int。如何检查我的编译器是否支持c99。我是C语言的初学者:)顺便说一句:
temp[x]=1.8*temp[x]+32
执行向零舍入的截断,将不精确的结果偏向0。建议(int)舍入(1.8*temp[x]+32)。最终你会得到更好的平均值。(通常的习惯用法+0.5只在所有转换都为正数的情况下才起作用。)为什么PO不接受或显然投票支持答案?我不明白你说的是什么。我试过这样的printf(“\n多少天:”);scanf(“%d”,&d);int temp[d];但它不起作用:(你需要更改行
int temp[10]
int*temp
。然后,代替执行
int-temp[d]
,使用我在回答中提供的代码。我不知道malloc。你能告诉我如何在我的程序中使用它吗。
malloc
基本上允许你为任何需要它的目的保留一些内存,但当你事先不知道它的大小时。可能是一个很好的地方start@Down选民们,从他的职位上可以清楚地看出他由于对指针知之甚少……请记住>@user2534857,您使用的是哪种编译器?@user2534857;给我介绍一下您的编译器/IDE(代码::block、Dev-c++、visualbasics等)@Hogan;那么他为什么还不接受任何答案呢
10
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>   //here
void input(int);
int *temp=0;  //here
int d;
void main()
{
    int x=0;
    float avg=0,t=0;
    printf("\nHow many days : ");
    scanf("%d",&d);
    temp=malloc(d * sizeof(int));  //here
    input(d);
    conv();
    for(x=0;x<d;x++)
    {
        t=t+temp[x];
    }
    avg=t/d;
    printf("Avarage is %f",avg);
    getch();
}
void input(int d)
{
    int x=0;
    for(x=0;x<d;x++)
    {
        printf("Input temperature in Celsius for #%d day",x+1);
        scanf("%d",&temp[x]);
    }
}
void conv()
{
    int x=0;
    for(x=0;x<d;x++)
    {
        temp[x]=1.8*temp[x]+32;
    }
}
int *temp;
  void input(int d)
    {
        int x=0;
        temp=(int*)malloc(sizeof(int)*d);
        for(x=0;x<d;x++)
        {
            printf("Input temperature in Celsius for #%d day",x+1);
            scanf("%d",&temp[x]);
        }
    }