代码之家  ›  专栏  ›  技术社区  ›  damir

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

c
  •  1
  • damir  · 技术社区  · 16 年前

    当我运行这个程序时,我在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]);
    }
    

    我知道我可以用

    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]);
       }
    

    但是有没有办法用指针来做这个呢?

    3 回复  |  直到 16 年前
        1
  •  5
  •   SLaks    16 年前

    通过写作 bla++ ,你在改变 bla 指向下一个指针。

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

    你可以通过写信来解决这个问题 bla -= 10 循环之后。

    然而,修复它的最佳方法是不增加 BLA 一点也不,而是写

     *(bla + i) = calloc(10,sizeof(char));
    

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

        2
  •  1
  •   Chris Dodd    16 年前

    问题是您的分配循环使用 bla 循环遍历指针数组,因此在循环结束时, BLA 指向数组结束后而不是开始。你需要一个像这样的循环:

    for (p=bla; p < bla+size; p++) { 
            *p = calloc(size, sizeof(char)); 
            strncpy(*p, "aaaaa", size); 
    } 
    
        3
  •  0
  •   bjg    16 年前

    问题在于,在第一种情况下,您已经将BLA指针移过了数组的末尾(最后一个BLA++),所以当您访问第一个时,实际上正在访问最后一个。