0

如何声明一个 char* 数组?(稍后将在我的程序中填充值时..)这是我的目标:

arr[0] = {"0a","0b","0c"};
arr[0][0] = "0a";
arr[0][1] = "0b";
..
arr[1] = {"1a","1b","1c"}
  1. char *arr[][]吗?我觉得很困惑。
  2. 将这个参数传递给函数怎么样?
4

5 回答 5

2

关闭,但您必须一次性使用聚合初始化,如下所示:

char arr[][2][3] = 
{
  {"0a", "0b"},
  {"1a", "1b"},
};

请注意,除了最重要(最左边)的数组之外的所有数组都必须明确调整大小。或者你可以将每个内部字符串声明为一个指针:

const char * arr[][2] = 
{
  {"0a", "0b"},
  {"1a", "1b"},
};

这取决于您的数据的结构化程度以及静态程度。如果要动态分配每个数组的内容,另一种方法是使用 stl std::vector。

于 2013-04-29T15:30:40.923 回答
1

是 char *arr[][] 吗?

听起来差不多。但是您需要在声明中为数组提供大小。

于 2013-04-29T15:31:00.087 回答
0

这些中的任何一个。请注意,这是几乎每个人都对 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 字符。

于 2013-04-29T15:29:16.770 回答
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]);

}
于 2013-04-29T15:48:48.843 回答
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]) {
于 2013-04-29T15:55:01.063 回答