17

如何初始化使用 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);

或者有更好的方法吗?

4

4 回答 4

26

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

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

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

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

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

0是将设置数组的每个位置的常量。请注意,最后一个参数是要设置为常量的字节数。因为数组的每个位置都存储一个整数,因此我们需要将总字节数作为此参数传递。

此外,如果您想将数组清零,那么您可能需要使用calloc而不是malloc. calloc将分配的字节位置设置为零后将返回内存块。

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

编辑1

请注意,如果您想在整数数组的位置分配一个特定的整数,memset那么这将是一个问题。这是因为memset会将数组解释为字节数组,并将您给定的字节分配给数组的每个字节。因此,如果您想在每个位置存储 11243,那么这是不可能的。

编辑2

还要注意为什么每次将 int 数组设置为 0 时memset可能不起作用:Why does "memset(arr, -1, sizeof(arr)/sizeof(int))" not clear an integer array to -1? 正如@Shafik Yaghmour 所指出的

于 2013-07-30T03:35:06.483 回答
21

而不是使用

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

我们可以用

int * p;
p =(int[3]){1,2,3};
于 2013-07-30T04:04:14.313 回答
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]);
}
于 2013-07-30T05:53:17.753 回答
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;
于 2013-07-30T03:09:39.587 回答