如何初始化使用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);
或者有更好的方法吗?
答案 0 :(得分: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;
}
如果需要使用零初始化数组,还可以使用stdlib中的memset
函数。
memset (arr, 0, sizeof (int) * n);
此处0
是用于设置数组中每个locatoin的常量。请注意,最后一个参数是要设置常量的字节数。因为数组的每个位置都存储一个整数,所以我们需要将总字节数作为此参数传递。
此外,如果您想将数组清除为零,则可能需要使用calloc
而不是malloc
。将分配的字节位置设置为零后,calloc
将返回内存块。
完成后,释放内存块free (arr)
。
<强> EDIT1 强>
请注意,如果要使用memset
在整数数组的位置分配特定整数,那么这将是一个问题。这是因为memset
会将数组解释为字节数组,并将给定的字节分配给数组的每个字节。因此,如果您想在每个位置存储11243,那么就无法实现。
<强> EDIT2 强>
另请注意为什么每次使用memset
将int数组设置为0都可能不起作用:{@ 3}}由@Shafik Yaghmour指出
答案 1 :(得分:16)
而不是使用
int * p;
p = {1,2,3};
我们可以使用
int * p;
p =(int[3]){1,2,3};
答案 2 :(得分: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;
答案 3 :(得分: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]);
}
答案 4 :(得分:1)
我认为更乏味的方式是唯一的方法。我尝试了第一个并且它没有编译(在评论'...'之后)
'C'中没有多少捷径我猜.ac