分配字符数组并打印第一个条目

dam*_*mir 1 c

当我运行这个我在printf上得到segv时,我做错了什么?

int main() {
        char **bla;
        int size =10;
        int i;

        bla = calloc(size*size,sizeof(char *));

        for(i=0;i<size;i++) {
                *bla = calloc(10,sizeof(char));
                strncpy(*bla,"aaaaa",size);
                bla++;
        }

        printf("%s\n",bla[0]);
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做

int main() {
        char **bla;
        int size =10;
        int i;

        bla = calloc(size*size,sizeof(char *));

        for(i=0;i<size;i++) {
                bla[i] = calloc(10,sizeof(char));
                strncpy(bla[i],"aaaaa",size);
        }



   printf("%s\n",bla[0]);
   }
Run Code Online (Sandbox Code Playgroud)

但有没有办法用指针做到这一点?

SLa*_*aks 5

通过写入bla++,您将更bla改为指向下一个指针.

最后,bla[0](相当于*bla)已增加10次,并将在分配的块之后立即指向内存位置.

您可以通过bla -= 10在循环后写入来解决此问题.

但是,修复它的最好方法是根本不增加bla,而是写

 *(bla + i) = calloc(10,sizeof(char));
Run Code Online (Sandbox Code Playgroud)

或者,你可以声明第二个指针(char** currentBlah = blah)然后递增它,然后打印blah[0],它仍然指向原始的内存位置.