当我运行这个我在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]);
}
但有没有办法用指针做到这一点?
答案 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 ++),所以当你访问第一个时,你实际上是访问了最后一个