int main() {
char *p[] = {"hello", "goodbye"};
char **a;
a = malloc(4 * 8);
}
我想要一个双倍的p插槽。如果不手动输入数字,我将如何成功地做到这一点。所有IK都是p的大小应该在那里,双倍的x 2。我怎么能得到8?
答案 0 :(得分:0)
我认为你要问的是如何弄清p
中放了多少个字符串。为此,您可以计算p
中的元素数量:
char *p[] = { "hello", "goodbye" };
printf("%zu\n", 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));
}
答案 1 :(得分:0)
使用sizeof
运算符返回a的字节大小
类型/变量需求。
在你的情况下
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;
}
答案 2 :(得分:0)
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);