-3

我确定以前有人问过这个问题,但是粗略的谷歌和堆栈溢出搜索并没有找到答案。

#include <stdio.h>

int main() {
    char a[128][1024];
    strcpy(a[0], "hello");
    strcpy(a[1], "foo");
    strcpy(a[2], "bar");
    char **b = a;
    printf("%s\n", a[0]); //same as printf("%s\n", a)
    printf("%s\n", a[2]+1); //print from 2nd char of 3rd string
    printf("%s\n", b); //same as printf("%s\n", a), makes sense
    printf("%s\n", b[0]); //segfault???
}

首先,为什么最后一个是段错误?我期望与 array 相同的行为a。如何以通用方式从 b 访问第 n 个字符串?a和b在治疗上有什么区别?

在类似的注释中,我理解它的方式a[n]*(a+n). 这对指针和数组都正确吗?然而,它似乎对a和有不同的行为b

谢谢!

4

2 回答 2

3

char **bb说:“在指向的地方b[0],有一个指向 char 的指针。而且,如果我使用b[1], b[2],...,它们也是指向 char 的指针。”</p>

相比之下char a[128][1024],“<code>a 是 128 个 1024 个字符的数组”。当你这样做的时候,在那个地方,a没有指针。只有字符。在内存中,它看起来像连续 131,072 个字符 (128•1024 = 131,072)。

当您分配 时char **b = a,假设编译器允许您这样做,您将设置b为 的地址a。使用时b[0],那里应该有一个指针。但是没有。那里只有炭。当您传递b[0]给 printf 时,编译器会转到b指向的位置,加载几个字节,就像它们是指针一样,并将结果值传递给 printf。然后 printf 崩溃,因为字节指向某个错误的位置。

的正确定义bchar (*b)[1024] = a;

于 2012-11-02T16:36:08.277 回答
0

这个

char **b = a;

是类型不匹配,因为a没有char[][]索引使用的是char *.

您可能想切换所有编译器警告(通过 执行gcc此操作-Wall)。

这条线

printf("%s\n", b[0]); 

取消引用指向字符指针的指针,即地址值。然后它尝试将地址值值打印为(0 结尾的)字符串,这很可能会访问随机内存。

于 2012-11-02T16:27:24.480 回答