gpt4 book ai didi

转换指针 - 运行时有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 16:29:00 26 4
gpt4 key购买 nike

考虑以下小示例代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int *i;
char *c1, *c2;

i = malloc(4);

*i = 65535;

c1 = i;
c2 = (char *)i;

printf("%p %p %p\n", i, c1, c2);
printf("%d %d", *c1, *c2);

free(i);

return 0;
}

在示例中,我分配内存来存储一个整数,它由i 指向。然后,我将值 65535 (1111 1111 1111 1111) 存储在 *i 中。接下来我要做的是让两个 char* 指针也指向整数。我做了两次,但采用两种不同的方式:c1 = i;c2 = (char *)i;。最后,我在屏幕上打印所有指针和所有值。三个指针指向同一个地址,*c1*c2这两个值都是正确的(-1)

但是,编译器会在这一行生成警告:c1 = i;。生成警告是因为我没有使用 (char *) cast 来执行分配。

我想问的是为什么编译器会产生这个警告,因为我没有看到使用c1 = i任何区别 ;或 c2 = (char *)i;。在这两种情况下,结果都是具有相同字节大小的相同地址。这对所有类型转换都有效,即使它是 (int *) 类型转换、(float *) 类型转换、(short *)强制转换等。所有这些都生成相同的值,但如果使用的强制转换是指针的类型,编译器只会在没有警告的情况下接受它。

我真的很想知道为什么编译器要求强制转换,即使结果总是一样。

最佳答案

当您使用时:

c2 = i;

编译器会警告您将类型 int* 分配给 char*。这可能是一个无意的错误。编译器警告您,希望如果它确实是无意的错误,您有机会修复它。

当您使用时:

c2 = (char *)i;

你是在告诉编译器,作为程序员,你知道自己在做什么。

关于转换指针 - 运行时有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27785497/

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