gpt4 book ai didi

c - 为什么 C 指针被推荐为它们所指向的数据的类型,如果它们是 8 字节大呢?

转载 作者:行者123 更新时间:2023-12-02 06:50:06 26 4
gpt4 key购买 nike

所以我正在学习 C 指针,但我有点困惑。指针只是指向特定的内存地址。

sizeof(char*), sizeof(int*), sizeof(double*) 全部输出8。所以它们都占用8字节来存储一个内存地址。

但是,如果我尝试编译这样的东西:

int main(void)
{
char letter = 'A';
int *a = &letter;
printf("letter: %c\n", *a);
}

我从编译器 (gcc) 收到警告:

 warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
int *a = &letter;

但是,char *a = &letter; 不会导致警告。

为什么指针的类型很重要,如果它是 8 字节长呢?为什么声明一个类型不同于它指向的数据类型的指针会产生警告?

最佳答案

问题不在于指针的大小——而是指针对象的类型。

如果您有一个指向 int 的指针,该指针会占用一定数量的字节(好像您有一个 64 位系统,其中该指针占用八个字节)。但是,如果您取消引用该指针以读取或写入它指向的内容,因为指针的类型是 int*,读取或写入将尝试操作 sizeof(int) 字节,它会尝试像处理 int 一样操作它们。

如果你有一个 char 类型的对象,根据定义,它的大小为 1,你尝试通过 int 类型的指针读取或写入它,这(在许多系统上)的大小为 4,然后读取指针将拉回一些垃圾数据以及 char 并写入指针将破坏 char 周围的随机内存区域> 具有不相关的值。

此外,C 有一个称为严格别名规则 的规则,它规定您不得通过与所指类型不匹配的类型的指针进行读取或写入(除非指针是 char *signed char*unsigned char* 类型)。打破严格的别名可能会扰乱各种编译器优化并导致代码不按预期运行。

所以简而言之,指针的大小真的不是这里的问题。它是关于当您尝试读取或写入所指向的内容时会发生什么的语义。

关于c - 为什么 C 指针被推荐为它们所指向的数据的类型,如果它们是 8 字节大呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com