seanapr21
@seanapr21

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C言語における可変長配列の初期化について

C言語にて可変長配列を0で初期化するスマートなやり方はないでしょうか。例えば、配列aの長さnをscanf()で取得、全ての要素を0とします。

#include <stdio.h>

int main() {
    int n;

    scanf("%d", &n);

    int a[n];

    for(int i = 0; i < n; i++) {
        a[i] = 0;
    }
    /*もしくはmemset(a, 0, sizeof(a));*/

    return 0;
}

現在はこのようにコードを書いていますが、よりコンパクトに記述する方法があればご教示ください。

0

4Answer

よりコンパクトに記述する方法があればご教示ください

無いと思います。
なお、memsetの引数は、
memset(a, 0, sizeof(int) * n);
では?


ちなみに、タグがC#になっているで修正された方がいいですよ。

3Like

Comments

  1. 古い手法ですが...

    #include <stdio.h>
    int main() {
        int n;
    
        scanf("%d", &n);
        int *a = calloc( n, sizeof(int) ); //領域確保&初期化
    
        free( a ); //確保領域解放
        return 0;
    }
    

邪道かもしれませんが、こんなのはどうでしょう?

#define zeros(name, type, n) type name[n]; memset(name, 0, sizeof(type) * n);
#include <stdio.h>
int main(void){
  int n;
  scanf("%d", &n);
  zeros(a, int, n);
  return 0;
}

一応すっきりしました!

1Like
#include <stdio.h>
#include <mylib.h>

int main() {
    int n;
    scanf("%d", &n);
    int a[n];

    zero(&a, n);

    return 0;
}

スッキリするマイライブラリーを作成しては?あれ、あれ、 zero(&a, n);はスッキリしないですね?引数1個にできない。

0Like

タグの C#C 言語ではありませんので変えた方がいいのではないでしょうか……?

0Like

Your answer might help someone💌