Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分配字符数组并打印第一个条目_C - Fatal编程技术网

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

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

当我运行这个程序时,我在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]);
}
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:我怀疑不是。这可能是指针的家庭作业。