如何声明char *数组的数组? (当我的程序稍后将填写值时)。这是我的目标:
arr[0] = {"0a","0b","0c"};
arr[0][0] = "0a";
arr[0][1] = "0b";
..
arr[1] = {"1a","1b","1c"}
char *arr[][]
吗?我感到非常困惑。答案 0 :(得分:2)
关闭,但你必须一次性使用聚合初始化,如下所示:
char arr[][2][3] =
{
{"0a", "0b"},
{"1a", "1b"},
};
请注意,除最重要(最左侧)数组外,其他所有数组都必须明确调整大小。或者您 可以将每个内部字符串声明为一个指针:
const char * arr[][2] =
{
{"0a", "0b"},
{"1a", "1b"},
};
这取决于您的数据的结构化程度以及静态程度。另一种方法是使用stl std :: vector,如果你想动态分配每个数组的内容。
答案 1 :(得分:1)
是char * arr [] []?
关于正确的声音。但是您需要在声明中为数组提供大小。
答案 2 :(得分:0)
其中任何一个。请注意,这是一件事,几乎每个人都在C中感到困惑。
char ** a;
此处a
是指向一个或多个字符的一个或多个指针的指针。内存中有一堆指针,每一个都指向一个字符串(可以这么说)。 a
指的是这些指针中的第一个。 (a+1)
指的是第二个。字符块每个都驻留在内存中,但不一定在彼此附近。你可以这样做:
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字符。
答案 3 :(得分: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]);
}
答案 4 :(得分:0)
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]) {