为什么我不能使用malloc来设置大于所需数组的数组?

时间:2014-03-24 19:34:57

标签: 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;
}

4 个答案:

答案 0 :(得分:5)

这段代码都错了。您调用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个元素。这很好。如果您进行过度分配,通常需要跟踪分配的长度和使用中的长度。然后,您可以通过增加使用中的长度来添加新项目,直到达到分配的长度。您需要重新分配更大的块。我想这就是你在开车的地方。

答案 1 :(得分:2)

问题是你的语法。你的意思是:int *mult_digits = malloc(8 * sizeof(int));

之后,mult_digits[] = {1,2,3,4};错了。但是,你可以

mult_digits[0] = 1;
mult_digits[1] = 2;
mult_digits[2] = 3;
mult_digits[3] = 4;

但除非你有一些理由深入到指针深处,否则你可能只想:

int mult_digits[] = {1, 2, 3, 4};

编辑:为了帮助应用这个答案,这里有一个完整修改过的函数,可以编译并运行:

#include <stdio.h>

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;
}

答案 2 :(得分:1)

方括号中的

必须指定所需元素的数量,而不是数组的字节长度。你可以使用malloc来做

int* multdigits = malloc(sizeof(int)*8);
mult_digits[0] = 1;

(对不起,如果我的语法错误,我不会写几年的c代码!)

他们有两种方法可以做同样的事情。将“malloc”视为“新”算子。

答案 3 :(得分:0)

尝试

int main(void)
{
    int mult_digits[] = {1,2,3,4};
    int size_mult = sizeof mult_digits / sizeof int;
    printf("Size of the array is %d\n", size_mult);
    return 0;
}