web-dev-qa-db-ja.com

初期サイズなしのC言語での配列の宣言

以下に示すように、温度の詳細を操作するプログラムを作成します。
-計算する日数を入力します。 - メイン機能
-摂氏温度での入力温度-入力関数
-温度を摂氏から華氏に変換します。-別の機能
-華氏の平均気温を見つけます。

配列の初期サイズなしでこのプログラムを作成するにはどうすればよいですか?

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

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

覚えておいてください-割り当てられた領域の外側にアクセスすると、未知の影響があります。

25
Hogan

初期サイズのない配列は、基本的にポインタです。配列のサイズを動的に設定するには、malloc()またはcalloc()関数を使用する必要があります。これらは、指定された量のメモリを割り当てます。

上記のコードで、tempをintとして宣言しますpointer

_int *temp;
_

次に、malloc()またはcalloc()を使用してスペースを割り当てます。これらの関数が取る引数は、割り当てるメモリのbytesの数です。この場合、d intsに十分なスペースが必要です。そう...

_temp = malloc(d * sizeof(int));
_

mallocは、割り当てられたばかりのメモリブロックの最初のバイトへのポインタを返します。通常の配列は、メモリのセクション化されたブロックの最初のバイトへの単なるポインタです。これは、まさにtempになりました。したがって、tempポインターを配列として扱うことができます!そのようです:

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

出力

_10
_
5
btidwell

temp配列ではなく)intポインターとしてintを宣言する必要があります。次に、mallocmainを使用できます(最初のscanfの後)。

temp = malloc(d * sizeof(int));
2
Drew McGowen

コンパイラが_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();
  }
_

日付入力後、main()内で_temp[]_が定義されるようになりました。

1
haccks

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

あなたがそれをはっきりと見ることができるように、私は何も変更しませんでした。

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

サイズを読み取った後、ヒープに「配列」を動的に割り当てます。