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

时间:2010-07-12 19:35:14

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

我知道我可以用

做到这一点
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 个答案:

答案 0 :(得分:5)

通过撰写bla++,您正在将bla更改为指向下一个指针。

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

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

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

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

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

答案 1 :(得分:1)

问题是你的分配循环使用bla来遍历指针数组,因此在该循环结束时,bla指向数组末尾而不是开头。你需要一个循环:

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

答案 2 :(得分:0)

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