如何声明一个 char* 数组?(稍后将在我的程序中填充值时..)这是我的目标:
arr[0] = {"0a","0b","0c"};
arr[0][0] = "0a";
arr[0][1] = "0b";
..
arr[1] = {"1a","1b","1c"}
- 是
char *arr[][]
吗?我觉得很困惑。 - 将这个参数传递给函数怎么样?
关闭,但您必须一次性使用聚合初始化,如下所示:
char arr[][2][3] =
{
{"0a", "0b"},
{"1a", "1b"},
};
请注意,除了最重要(最左边)的数组之外的所有数组都必须明确调整大小。或者你可以将每个内部字符串声明为一个指针:
const char * arr[][2] =
{
{"0a", "0b"},
{"1a", "1b"},
};
这取决于您的数据的结构化程度以及静态程度。如果要动态分配每个数组的内容,另一种方法是使用 stl std::vector。
是 char *arr[][] 吗?
听起来差不多。但是您需要在声明中为数组提供大小。
这些中的任何一个。请注意,这是几乎每个人都对 C 语言感到困惑的一件事。
char ** a;
这a
是一个指向一个或多个指向一个或多个字符的指针。内存中某处有一堆指针,每个指针都指向一个字符串(可以这么说)。a
指的是这些指针中的第一个。(a+1)
指第2个。每个字符块都驻留在内存中的某个位置,但不一定彼此靠近。你可以这样做:
for (int i = 0 ; i < 10 ; ++i) {
a++ = malloc(100);
}
或者你可以这样做:
char *b = malloc(1000);
for (int i = 0 ; i < 10 ; ++i) {
a++ = b;
b += 100;
}
您将在数组中填充 10 个指针,每个指针指向 100 个字符。(好吧,真的是 100 个字符的空格,因为我们还没有填写任何字符。)
char* a[];
这里又a
是一堆指向一堆字符中的第一个的指针。char ** a
如果您要全部重用它们,这实际上是相同的,但更有意义。
for (int i = 0 ; i < 10 ; ++i) {
a[i] = malloc(100);
}
这将做与上面相同的事情,但更容易回到任何给定的字符块。例如,我们可以做strcpy(a[4], "Bob was here");
char a[][];
这有点不同,因为它是一个指向一堆字符的指针,这些字符可以分成相同长度的块。在这种情况下,您通常会给出大小,除非它太大而无法在堆栈上分配。char a[10][100]
将在内存中分配 1000 个字符点,并将它们分成 10 组,每组 100 个。
请注意,您的示例{"0a","0b","0c"};
是一种分配三个内存块的方法。每个都是三个字节长,并预先填充了那里的字符(以及一个结束 \0 字符。
int main (int argc, char *argv[]){
char arr[10][2][3] = {0};
memcpy(&arr[0][0], "k", sizeof(arr[0][0]));
memcpy(&arr[0][1], "ki", sizeof(arr[0][0]));
memcpy(&arr[1][0], "s", sizeof(arr[0][0]));
memcpy(&arr[1][1], "si", sizeof(arr[0][0]));
printf("%s %s\n", arr[0][0], arr[1][1]);
}
void fill(char *arr[10][2]) {
arr[0][0] = strdup("k");
arr[0][1] = strdup("ki");
arr[1][0] = strdup("s");
arr[1][1] = strdup("si");
}
void clean(char *arr[10][2]) {
free(arr[0][0]);
free(arr[0][1]);
free(arr[1][0]);
free(arr[1][1]);
}
int main (int argc, char *argv[]){
char *array[10][2] = {NULL};
fill(array);
printf("%s %s\n", array[0][0], array[1][1]);
// when arr[i][j] bcome useless in your code, do not forget to free memories
clean(array);
}
和函数fill
也clean
可以通过以下方式定义:
void fill(char *arr[][2]) {
void clean(char *arr[][2]) {