正在初始化C动态数组



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

或者有更好的方法吗?

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

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而不是malloc。CCD_ 6将在将所分配的字节位置设置为零之后返回存储器块。

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

EDIT1

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

EDIT2

还要注意为什么每次用CCD_ 10将int数组设置为0可能不起作用:;memset(arr,-1,sizeof(arr)/sizeof(int))";没有将整数数组清除为-1?正如@Shafik Yaghmour 所指出的

而不是使用

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

我们可以使用

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

您不能使用建议的语法。如果你有一个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]);
}

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;

相关内容

  • 没有找到相关文章

最新更新