与malloc混淆。创建一个包含4个插槽的字符串数组

时间:2018-03-18 03:17:20

标签: c malloc

int main() {

  char *p[] = {"hello", "goodbye"};

  char **a;
  a = malloc(4 * 8);

}

我想要一个双倍的p插槽。如果不手动输入数字,我将如何成功地做到这一点。所有IK都是p的大小应该在那里,双倍的x 2。我怎么能得到8?

3 个答案:

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