c - 与马洛克混淆.创建一个具有 4 个插槽的字符串数组


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

最新更新