初始化C动态数组

12 c arrays malloc

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

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

...

free(p);
Run Code Online (Sandbox Code Playgroud)

或者我需要做这样的事情:

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

...

free(p);
Run Code Online (Sandbox Code Playgroud)

或者有更好的方法吗?

pho*_*xis 19

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

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

for (i=0; i<n; i++)
{
  arr[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)

如果需要使用零初始化数组,还可以使用memsetstdlib中的函数.

memset (arr, 0, sizeof (int) * n);
Run Code Online (Sandbox Code Playgroud)

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

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

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

EDIT1

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

EDIT2

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


Ent*_*KEY 17

而不是使用

int * p;
p = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

我们可以用

int * p;
p =(int[3]){1,2,3};
Run Code Online (Sandbox Code Playgroud)

  • 这不是`malloc`-ed数组的替代品!您用来初始化`p`的复合文字具有自动存储持续时间.它将在块结束时自动释放,并且手动调用"free"是未定义的行为.您不能使用它来分配您要返回的数组,或者分配必须在当前块之外保留的任何内容. (9认同)
  • 这正是我想要的!如果每个单独的元素都有自己的值,并且无法以任何方式计算,那么超级有用,因此您最终会单独为每个元素编写初始化.一个问题:它是任何C标准的一部分,还是特定于编译器? (2认同)

caf*_*caf 6

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

int *p;

p = malloc(3 * sizeof p[0]);
memcpy(p, (int []){ 0, 1, 2 }, 3 * sizeof p[0]);
Run Code Online (Sandbox Code Playgroud)

如果您的编译器不支持 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]);
}
Run Code Online (Sandbox Code Playgroud)


Lid*_*Guo 3

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

你永远不能使用这个:

int * p;
p = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

循环是对的

int *p,i;
p = malloc(3*sizeof(int));
for(i = 0; i<3; ++i)
    p[i] = i;
Run Code Online (Sandbox Code Playgroud)