访问char [] []和char **中的成员之间的区别

时间:2017-10-18 12:41:34

标签: c arrays pointers

如果我有一个数组,例如:

char array[10][20];

然后它是一个包含10个字符串的数组,每个字符串的长度为20.如果我使用malloc创建一个类似的数组:

char **dyn_array = (char **) malloc(10 * sizeof(char *));

然后我如何访问会员?例如,如果我有一个循环:

int limit, count=0;
printf("Enter the limit (max 10): ");
scanf("%d", &limit);
fflush(stdin);
while(count < limit)
{
    int index = 0;
    printf("\nEnter characters: ");
    fgets(array[count], sizeof(array[count]), stdin);
    fflush(stdin);
    printf("\nYou typed: ");
    while(array[count][index] != '\n' && 
        array[count][index] != '\0')
    {
        printf("%c", array[count][index]);
        index += 1;
    }
    count += 1;
}

我可以在每个位置用dyn_array替换数组并使它们相同吗?我需要做出哪些改变?我知道这两种数组的工作方式是相似的,但我无法绕过它。

1 个答案:

答案 0 :(得分:3)

char array[10][20];
  

然后它是一个包含10个字符串的数组,每个字符串长度为20。

不,不是。它是一个由10个阵列组成的阵列,每个阵列有20个字符。提醒一个c-string只是一个由NUL个终止的连续字符序列。 char数组可能包含c字符串,但不是必需的。

  

如果我使用malloc创建一个类似的数组:

char **dyn_array = (char **) malloc(10 * sizeof(char *));

不,它不相似,因为你刚刚创建了一个包含10个指向字符的数组的数组(为此你将地址存储到指针中)。但是这些指针(数组中的指针)并没有初始化为任何东西。要获得类似的东西,你可以写:

for (int i=0; i<10; i++)
    dyn_array[i] = malloc(20*sizeof(char));

因此,在这两种情况下,您都可以撰写array[count][index]dyn_array[count][index]

但是你不能写fget(dyn_array[count],sizeof(dyn_array[count],stdin);,因为在这种情况下dyn_array[count]不是数组而是指针。提醒数组可以衰减到指针,但指针不是数组。

关于指针与数组有几个问题。读取。