当我运行这个我在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)
但有没有办法用指针做到这一点?
通过写入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],它仍然指向原始的内存位置.
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |