删除阵列与指针

dereferencing array vs pointer

本文关键字:指针 阵列 删除      更新时间:2023-10-16

我敢肯定这是以前问的,但是粗略的Google和stack Overflow搜索没有打开答案。

#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("%sn", a[0]); //same as printf("%sn", a)
    printf("%sn", a[2]+1); //print from 2nd char of 3rd string
    printf("%sn", b); //same as printf("%sn", a), makes sense
    printf("%sn", b[0]); //segfault???
}

首先,为什么最后一个是segfault?我期望与数组a相同的行为。如何以广义方式从B访问n字符串?A和B之间的治疗差异是什么?

在类似的音符上,我理解的方式是a[n]*(a+n)的句法糖。这是正确的,无论是指指针还是用于数组?然而,ab的行为似乎不同。

谢谢!

char **b说"在bb[0]的地方,有一个指向char的指针。而且,如果我使用b[1]b[2],…,那也是char的指针。"

相反的char a[128][1024]说:" a是128个阵列1024 char。"当您这样做时,在a所在的地方,没有指针。只有char。在内存中,它看起来像131,072 char(128•1024 = 131,072)。

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

b的适当定义是char (*b)[1024] = a;

这个

char **b = a;

是一种类型不匹配,因为achar[][],没有索引是char *

您可能想切换所有编译器警告(在gcc上,这是通过-Wall DOEN)。

这条线

printf("%sn", b[0]); 

表示指向字符指针的指针,这是一个地址值。然后,它试图将地址值打印为(0端)字符串,最有可能访问随机内存的字符串。