用c语言声明数组而没有初始大小

时间:2013-06-29 15:41:41

标签: 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;
    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;
    }
}

8 个答案:

答案 0 :(得分:25)

在C数组和指针中密切相关。实际上,通过设计,数组只是访问指向已分配内存的指针的语法约定。

所以在C语句中

 anyarray[n] 

相同
 *(anyarray+n)

使用指针算法。

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

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

以下是一些示例 -

int *temp = null; // this will be our array


// allocate space for 10 items
temp = malloc(sizeof(int)*10);


// reference the first element of temp
temp[0] = 70;


// free the memory when done
free(temp);

请记住 - 如果您在分配区域之外访问,则会产生未知效果。

答案 1 :(得分:5)

没有初始大小的数组基本上只是指针。为了动态设置数组的大小,您需要使用malloc()calloc()函数。这些将分配指定数量的内存字节。

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

int *temp;

然后使用malloc()calloc()为其分配空间。这些函数所采用的参数是要分配的内存的字节的数量。在这种情况下,您需要足够的d整数空间。所以......

temp = malloc(d * sizeof(int));

malloc返回指向刚分配的内存块中第一个字节的指针。常规数组只是指向分段的内存块中第一个字节的指针,这正是temp现在正是如此。因此,您可以将temp指针视为数组!像这样:

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

输出

10

答案 2 :(得分:2)

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

temp = malloc(d * sizeof(int));

答案 3 :(得分:1)

如果你的编译器支持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();
  }

现在temp[]在日期输入后在main()内定义。

答案 4 :(得分:1)

在文件顶部添加#include<stdlib.h>。然后修改conv()代码,如下所示:
2-修改temp声明如下(全局变量):

int *temp;

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

  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]);
        }
    }

答案 5 :(得分:0)

在读取大小后,在堆上动态分配“数组”。

答案 6 :(得分:0)

我没有改变任何其他内容,所以你可以清楚地看到它。

#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;
    }
}

答案 7 :(得分:0)

也许答案来晚了,但是... 如果使用小型嵌入式系统,则可能没有malloc和free函数。 因此,您必须牺牲366 * sizeof(your_type)的内存,对其进行静态定义并用作循环缓冲区。然后,您始终可以根据需要计算平均值的天数对其进行切片。 当然,这是自然的约束。您可以自己定义。