int main() {
char *p[] = {"hello", "goodbye"};
char **a;
a = malloc(4 * 8);
}
我想要一个双倍的p插槽。如果不手动输入数字,我将如何成功做到这一点。所有 IK 的大小都是 p 应该在那里,x 2 是双精度。我怎么会得到 8?
使用 sizeof
运算符,该运算符返回的大小(以字节为单位(类型/变量需求。
在您的情况下
int main() {
// because "hello" and "goodbye" are const char*
const char *p[] = {"hello", "goodbye"};
size_t len_p = sizeof p / sizeof p[0];
char **a;
a = malloc( 2 * len_p * sizeof *a );
...
free(a);
}
sizeof p / sizeof p[0];
返回 p
数组中的元素数。 sizeof p
返回字节总数,sizeof p[0]
返回单个元素的大小。因此,元素的总大小/大小返回您元素数。但请注意,此方法仅适用于数组,不适用于数组指针。考虑一下:
void add_one(int *ptr)
{
size_t len = sizeof ptr / sizeof ptr[0];
for(size_t i = 0; i < len; ++i)
ptr[i] += 1;
}
int main(void)
{
int arr[] = { 1,2 3 };
add_one(arr);
return 0;
}
是错误的,因为ptr
是指针,而不是数组,所以sizeof ptr
返回你指针的大小,而不是 arr
所需的总字节数。这就是为什么当您编写一个函数时,该函数在传递数组的位置上获取指针,函数也应该取数组的大小,否则大小不能计算,例如:
void add_one(int *ptr, size_t len)
{
for(size_t i = 0; i < len; ++i)
ptr[i] += 1;
}
int main(void)
{
int arr[] = { 1,2 3 };
add_one(arr, sizeof arr / sizeof arr[0]);
return 0;
}
我想你要问的是如何弄清楚p
中放了多少个字符串。 为此,您可以计算p
中的元素数量:
char *p[] = { "hello", "goodbye" };
printf("%zun", sizeof(p) / sizeof(*p));
sizeof(p)
是p
的总大小
sizeof(*p)
是单个元素的大小p
因此,将它们除以可以得到p
中的元素数量
要malloc()
第二个数组,两倍大:
int main() {
char *p[] = { "hello", "goodbye", "lala" };
size_t size = sizeof(p) / sizeof(*p);
char **a;
a = malloc(size * 2 * sizeof(*a));
}
void allocarr(char** matrix, int bytes, int slots)
{
int i = 0;
while(i <= slots)
{
matrix[i] = (char*)calloc(1, bytes);
++i;
}
}
。
char** s = malloc(4*sizeof(char*);
s = allocarr(s, 512, 4);