c - 为什么我不能使用 malloc 将数组大小设置为大于所需的大小?

标签 c arrays malloc

我来自 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/

相关文章:

python - 用于计算平方除数列表的 python 代码的优化

c - 如何在 x 和 y 轴上创建小行星

c++ - 如何跨 DLL 边界跟踪内存

c - C 中的 Malloc、free 和 realloc 行为

c - 如何在不覆盖c中的struct的情况下附加元素

c - 如何抑制编译器对 C 中未使用变量的警告?

c - 为什么带变量的数组分配有效?

c - RPC float 结果错误

c# - 将二维数组的二维数组转换为单个二维数组

javascript - jQuery用阿拉伯数字数组替换英文数字数组