动态指针数组
Dynamic array of pointers
我有一个字符串指针数组。
char **array;
我这样声明它而不是 char *array[N] 因为这个数组不会有一个静态数量的元素。
以这种方式声明数组,我可能每次添加新元素(指向字符串的指针)时都必须重新分配它的大小。
int main(void)
{
char **array;
char *word = "lolol";
char *word2 = "blabla";
return 0;
}
你能举个例子说明我应该如何在数组中 "create space" 来存储指向这些字符串的指针吗?
只需为数组中的指针分配一些空间,并在完成后释放它。
char *word = "lolol";
char *word2 = "blabla";
char** array = malloc(2*sizeof(char*));
array[0] = word;
array[1] = word2;
free(array);
如果您需要更多元素,可以将 2*sizeof(char*)
更改为 N*sizeof(char*)
。
最好的方法可能是制作 struct
这样,您可以调整它的大小,并根据需要添加任意数量的字符串,而无需选择特定大小。
注意:将 string_array 的 capacity
和 size
设置为 0 是它工作所必需的。
您可以通过这样的函数来完成:
void load_array(string_array *array)
{
array->size = 0;
array->capacity = 0;
}
并这样称呼它:
load_array(&my_array);
注意,当使用 []
从这些数组之一获取值时,您必须这样调用它:
my_array.arr[index]
这是因为你必须引用数组结构中的指针,如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);
}
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
size_t N = 2;
char **array = malloc( N * sizeof( char * ) );
if ( !array ) return 1;
char *word = "lolol";
char *word2 = "blabla";
array[0] = word;
array[1] = word2;
char *word3 = "Hello";
++N;
array = realloc( array, N * sizeof( char * ) );
if ( !array ) return 2;
array[2] = word3;
for ( size_t i = 0; i < N; i++ ) puts( array[i] );
free( array );
return 0;
}
程序输出为
lolol
blabla
Hello
我有一个字符串指针数组。
char **array;
我这样声明它而不是 char *array[N] 因为这个数组不会有一个静态数量的元素。
以这种方式声明数组,我可能每次添加新元素(指向字符串的指针)时都必须重新分配它的大小。
int main(void)
{
char **array;
char *word = "lolol";
char *word2 = "blabla";
return 0;
}
你能举个例子说明我应该如何在数组中 "create space" 来存储指向这些字符串的指针吗?
只需为数组中的指针分配一些空间,并在完成后释放它。
char *word = "lolol";
char *word2 = "blabla";
char** array = malloc(2*sizeof(char*));
array[0] = word;
array[1] = word2;
free(array);
如果您需要更多元素,可以将 2*sizeof(char*)
更改为 N*sizeof(char*)
。
最好的方法可能是制作 struct
这样,您可以调整它的大小,并根据需要添加任意数量的字符串,而无需选择特定大小。
注意:将 string_array 的 capacity
和 size
设置为 0 是它工作所必需的。
您可以通过这样的函数来完成:
void load_array(string_array *array)
{
array->size = 0;
array->capacity = 0;
}
并这样称呼它:
load_array(&my_array);
注意,当使用 []
从这些数组之一获取值时,您必须这样调用它:
my_array.arr[index]
这是因为你必须引用数组结构中的指针,如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);
}
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
size_t N = 2;
char **array = malloc( N * sizeof( char * ) );
if ( !array ) return 1;
char *word = "lolol";
char *word2 = "blabla";
array[0] = word;
array[1] = word2;
char *word3 = "Hello";
++N;
array = realloc( array, N * sizeof( char * ) );
if ( !array ) return 2;
array[2] = word3;
for ( size_t i = 0; i < N; i++ ) puts( array[i] );
free( array );
return 0;
}
程序输出为
lolol
blabla
Hello