如何声明char *数组的数组?

时间:2013-04-29 15:25:50

标签: c arrays char

如何声明char *数组的数组? (当我的程序稍后将填写值时)。这是我的目标:

arr[0] = {"0a","0b","0c"};
arr[0][0] = "0a";
arr[0][1] = "0b";
..
arr[1] = {"1a","1b","1c"}
  1. char *arr[][]吗?我感到非常困惑。
  2. 如何将此参数传递给函数?

5 个答案:

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

fillclean函数也可以通过以下方式定义:

void fill(char *arr[][2]) {
void clean(char *arr[][2]) {