如何将二维字符串数组分配给字符指针数组?

时间:2015-11-28 05:26:28

标签: c arrays pointers pointer-to-pointer

我一直在尝试将char字[x] [y]分配给char *指针[x]。但是编译器给了我一个错误

  

数组类型'char * [5]'不可分配   指针=&字[0]

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(){
    char words[5][10]={"Apple", "Ball", "Cat", "Dog", "Elephant"};
    char *pointer[5];
    pointer = &words[0];
    char **dp;
    dp = &pointer[0];

    int n;
    for(n=0; n<5; n++){
        printf("%s\n", *(dp+n));
    }
return 0;
}

但代码可以正常工作

char *pointer[5]={"Apple", "Ball", "Cat", "Dog", "Elephant"};
char **dp;
dp = &pointer[0];

我只需要将2D数组正确分配到指针数组!!

2 个答案:

答案 0 :(得分:1)

不幸的是,你无法按照自己的方式去做。 char words[5][10]不会将指针本身存储在任何地方,它实际上是一个包含50个字符的数组。 sizeof(words) == 50

在内存中,它看起来像:

'A','p','p','l','e','\0',x,x,x,x,'B','a'...

这里没有地址。当你做单词[3]只是(单词+3)或(char *)words + 30

另一方面,char *pointer[5]是一个由五个指针sizeof(pointer) == 5*sizeof(char*)组成的数组。

因此,您需要通过计算偏移量来手动填充pointer数组。像这样:

for (int i = 0; i < 5; i++) pointer[i] = words[i];

答案 1 :(得分:0)

pointer = &words[0];上的错误发生是因为您正在使用'数组指针'并使其指向第一个字符数组,因为指针指向一个字符,这没有任何意义。尝试类似:

char *pointer[5];
pointer[0] = &words[0][0];
pointer[1] = &words[1][0];
//...

这会使你的指针指向你的字符串的第一个char(我假设它是所期望的行为?)