我来自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;
}
Run Code Online (Sandbox Code Playgroud)
这段代码都错了.您调用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;
}
Run Code Online (Sandbox Code Playgroud)
这里的数组不是动态分配的.它是一个自动的局部变量,存储在堆栈中.
对于动态分配,您可以这样做:
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;
}
Run Code Online (Sandbox Code Playgroud)
参数to 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;
}
Run Code Online (Sandbox Code Playgroud)
这里我们只使用前4个元素,而忽略了最后的4个元素.这很好.如果您进行过度分配,通常需要跟踪分配的长度和使用中的长度.然后,您可以通过增加使用中的长度来添加新项目,直到达到分配的长度.您需要重新分配更大的块.我想这就是你在驾驶的东西.
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |