我来自 Python,所以使用 malloc 对我来说是新的。直观上,下面的代码应该可以工作,但存在语法问题。在第一行中,我想将数组大小设置为最多 8 个整数。在第二行中,我想添加这 4 个整数。该行仅作为示例,在生产中我将让用户输入最多 8 位数字。当我去编译(clang)时,我得到 size of array has non-integer type 'void *'
如果我注释掉第一行并用第二行初始化(并添加 int 类型)代码作品。所以我显然错误地设置了尺寸。有什么想法吗?
int main(void)
{
int mult_digits[malloc(8 * sizeof(int))];
mult_digits[] = {1,2,3,4};
int size_mult = sizeof mult_digits / sizeof *mult_digits;
printf("Size of the array is %d\n", size_mult);
return 0;
}
最佳答案
这段代码完全错误。您调用 malloc
来分配内存,并且 malloc
返回一个指针。我不会解构你的语法(它非常糟糕),而是给出你的程序的几个变体。
int main(void)
{
int mult_digits[] = {1,2,3,4};
int size_mult = sizeof mult_digits / sizeof *mult_digits;
printf("Size of the array is %d\n", size_mult);
return 0;
}
这里的数组不是动态分配的。它是一个自动的局部变量,存储在堆栈中。
对于动态分配,您可以这样做:
int main(void)
{
int *mult_digits = malloc(4*sizeof *mult_digits);
mult_digits[0] = 1;
mult_digits[1] = 2;
mult_digits[2] = 3;
mult_digits[3] = 4;
free(mult_digits);
return 0;
}
malloc
的参数是要返回的字节数。返回的值是新内存块的地址。另请注意,这里我们调用了 free 来释放内存。如果省略,内存将会泄漏。
使用此变体,无法从 mult_digits
恢复数组的长度。我知道这可能会吓到你,因为来自 Python,但我再说一遍。无法从 mult_digits
恢复数组的长度。您的工作就是跟踪这些信息。
现在,您想要过度分配内存。你当然可以这样做:
int main(void)
{
int *mult_digits = malloc(8*sizeof *mult_digits);
mult_digits[0] = 1;
mult_digits[1] = 2;
mult_digits[2] = 3;
mult_digits[3] = 4;
free(mult_digits);
return 0;
}
这里我们只使用了前 4 个元素,忽略了最后 4 个元素。这样就可以了。如果您确实过度分配,您通常需要跟踪分配的长度和使用中的长度。然后,您可以通过增加使用中的长度来添加新项目,直到达到分配的长度。您需要重新分配更大的 block 。我想这就是你的目的。
关于c - 为什么我不能使用 malloc 将数组大小设置为大于所需的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22618955/