动态指针数组

pir*_*x22 2 c arrays pointers c-strings dynamic-memory-allocation

我有一个指向字符串的指针数组。

char **array; 
Run Code Online (Sandbox Code Playgroud)

我以这种方式声明它而不是 char *array[N] 因为这个数组不会有静态数量的元素。

以这种方式声明数组,每次添加新元素(指向字符串的指针)时,我可能都必须重新分配它的大小。

int main(void)
{
    char **array;

    char *word = "lolol";
    char *word2 = "blabla";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你能给我一个关于我应该如何在数组中“创建空间”以存储指向这些字符串的指针的例子吗?

use*_*093 5

最好的方法可能是制作一个 struct

这样,您可以调整它的大小,并根据需要添加任意数量的字符串,而无需选择特定大小。

注意:将 string_array 的capacityand设置size为 0 是它工作所必需的。

你可以用这样的函数来代替:

void load_array(string_array *array)
     {
     array->size = 0;
     array->capacity = 0;
     }
Run Code Online (Sandbox Code Playgroud)

并这样称呼它:

load_array(&my_array);
Run Code Online (Sandbox Code Playgroud)

请注意,当使用从这些数组之一获取值时[],您必须像这样调用它:

my_array.arr[index]
Run Code Online (Sandbox Code Playgroud)

这是因为您必须引用数组结构中的指针,即 as arr( char **)

我已经测试了以下内容,并且效果很好。

# include <stdio.h>

typedef struct string_array
    {
    char **arr;
    unsigned capacity, size;
    } string_array;

void add_to_array(string_array *array, char *str)
    {
    if(array->capacity == 0)
        {
        array->arr = (char **)malloc((array->capacity = 3) * sizeof(char *));
        array->arr[array->size++] = str;
        }
    else if(array->capacity == array->size)
        {
        array->arr = (char **)realloc(array->arr, (array->capacity *= 1.5) * sizeof(char *));
        array->arr[array->size++] = str;
        }
    else
        {
        array->arr[array->size++] = str;
        }
    }

int main(void)
    {
    char *str1 = "Hello World";
    char *str2 = "Hello World2";
    char *str3 = "Hello World3";
    char *str4 = "Hello World4";
    char *str5 = "Hello World5";
    string_array my_array;
    my_array.capacity = 0;
    my_array.size = 0;
    add_to_array(&my_array, str1);
    add_to_array(&my_array, str2);
    add_to_array(&my_array, str3);
    add_to_array(&my_array, str4);
    add_to_array(&my_array, str5);
    // and so on
    for (int i = 0; i < my_array.size; ++i)
        {
        printf(my_array.arr[i]);
        printf("\n");
        }
    free(my_array.arr);
    getchar(); // this means pressing enter closes the console
    return (0);
    }
Run Code Online (Sandbox Code Playgroud)