C 分配字符数组并打印第一个条目
当我运行这个程序时,我在printf上得到了segv,我做错了什么C 分配字符数组并打印第一个条目,c,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));
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]);
}
intmain(){
字符**bla;
int size=10;
int i;
bla=calloc(size*size,sizeof(char*));
对于(i=0;i通过写入bla++
,您将bla
更改为指向下一个指针
最后,bla[0]
(相当于*bla
)已递增10倍,并将在分配的块之后立即指向内存位置
您可以通过在循环之后写入bla-=10
来修复此问题
但是,修复它的最佳方法是根本不增加bla
,而是编写
*(bla + i) = calloc(10,sizeof(char));
或者,您可以声明第二个指针(char**currentBlah=blah
)并将其递增,然后打印blah[0]
,它仍将指向原始内存位置。通过写入bla++
,您将bla
更改为指向下一个指针
最后,bla[0]
(相当于*bla
)已递增10倍,并将在分配的块之后立即指向内存位置
您可以通过在循环之后写入bla-=10
来修复此问题
但是,修复它的最佳方法是根本不增加bla
,而是编写
*(bla + i) = calloc(10,sizeof(char));
或者,您可以声明第二个指针(char**currentBlah=blah
)并将其递增,然后打印blah[0]
,它仍将指向原始内存位置。问题是分配循环使用bla
迭代指针数组,因此在该循环结束时,bla
指向数组结束后而不是开始后。您需要一个类似以下的循环:
for (p=bla; p < bla+size; p++) {
*p = calloc(size, sizeof(char));
strncpy(*p, "aaaaa", size);
}
for(p=bla;p
问题在于,您的分配循环使用bla
迭代指针数组,因此在该循环的末尾,bla
指向数组的末尾,而不是开头。您需要一个类似以下的循环:
for (p=bla; p < bla+size; p++) {
*p = calloc(size, sizeof(char));
strncpy(*p, "aaaaa", size);
}
for(p=bla;p
问题在于,在第一种情况下,您将bla指针移过了数组的末尾(最后一个bla++),因此当您访问第一个时,您实际上是在访问最后一个问题在于,在第一种情况下,您将bla指针移过了数组的末尾(最后一个bla++)因此,当您访问第一个指针时,您实际上是在访问最后一个指针之后的第二个指针。我建议您使用第二个指针来遍历数组。如果您忘记了alloc
返回的值,您以后将无法释放内存。为了获得最佳结果,请复制一个指针,不要触摸原始指针。-1*(bla+i)
只是bla[i]
,这正是OP想要避免的…@Chris:我怀疑不是。这可能是指针的家庭作业。我支持使用第二个指针遍历数组的建议。如果你忘记了alloc
返回的值,你以后将无法释放内存。为了获得最佳结果lts,复制一份,不要碰原始指针。-1*(bla+i)
只是bla[i]
,这正是OP想要避免的…@Chris:我怀疑不是。这可能是指针的家庭作业。