初始化C语言动态数组

18

我该如何初始化使用malloc分配的动态数组?我可以这样做吗:

int *p;
p = malloc(3 * sizeof(*p));
p = {0, 1, 2};

...

free(p);

或者我需要像这样做:

int *p, x;
p = malloc(3 * sizeof(*p));
for (x = 0; x < 3; x++)
    p[x] = 0;

...

free(p);

还有更好的方法吗?


1
你是不是想说 p[x] = x; 而不是 p[x] = 0; - Mysticial
1
第二种方法是正确的方式。第一种会得到编译器错误,不是吗? - Barmar
http://fydo.net/gamedev/dynamic-arrays 展示了如何使用动态数组。实际上,这是一个非常受欢迎的链接,你可以在任何主要搜索引擎中找到它... - franklin
1
我听说有些程序员会使用memset()函数来做类似这样的事情。 - user2381799
你为什么要首先使用 malloc - Ed Heal
显示剩余5条评论
4个回答

27
你需要分配一块内存,并将其用作数组,如下所示:

您需要分配一块内存并将其用作数组,如:

int *arr = malloc (sizeof (int) * n); /* n is the length of the array */
int i;

for (i=0; i<n; i++)
{
  arr[i] = 0;
}

如果您需要使用零初始化数组,您还可以使用C标准库中的memset函数(声明在string.h中)。

memset (arr, 0, sizeof (int) * n);

这里的0是用来设置数组每个位置的常量。请注意,最后一个参数是要设置为常量的字节数。因为数组的每个位置存储一个整数,所以我们需要把总字节数作为参数传递。

另外,如果您想将数组清零,则可以使用calloc而不是malloccalloc将在将分配的字节位置设置为零后返回内存块。

完成后,请释放内存块free (arr)

EDIT1

请注意,如果您想使用memset在整数数组的位置上分配特定的整数,则会出现问题。这是因为memset 将把数组解释为字节数组,并将您给出的字节分配给数组的每个字节。因此,如果您想在每个位置存储11243,则无法实现。

EDIT2

此外,请注意为什么每次使用memset将int型数组设置为0可能不起作用:为什么"memset(arr,-1,sizeof(arr)/ sizeof(int))"不能将整数数组清零为-1?,由@Shafik Yaghmour指出。


23

不要使用

int * p;
p = {1,2,3};

我们可以使用

int * p;
p =(int[3]){1,2,3};

2
这正是我一直在寻找的!如果每个单独的元素都有自己无法计算的值,那么编写每个元素的初始化代码就非常有用。 还有一个问题:它是C标准的一部分,还是特定于编译器? - Ignas2526
15
这不是 malloc 函数的直接替代品!你正在使用复合字面量来初始化变量 p,它具有自动存储期。它将在块的末尾自动释放,手动调用 free 函数会导致未定义的行为。你不能使用这个方法来分配一个需要在当前块之外继续存在的数组或者其他任何东西。 - user2357112

8

您不能使用您提出的语法。但是,如果您拥有C99编译器,则可以执行以下操作:

int *p;

p = malloc(3 * sizeof p[0]);
memcpy(p, (int []){ 0, 1, 2 }, 3 * sizeof p[0]);

如果你的编译器不支持C99复合文字,你需要使用一个命名模板来复制:

int *p;

p = malloc(3 * sizeof p[0]);
{
    static const int p_init[] = { 0, 1, 2 };
    memcpy(p, p_init, 3 * sizeof p[0]);
}

3

p = {1,2,3}是错误的。

你永远不能使用这个:

int * p;
p = {1,2,3};

循环正确。
int *p,i;
p = malloc(3*sizeof(int));
for(i = 0; i<3; ++i)
    p[i] = i;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接