我来自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;
}
答案 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;
}