gpt4 book ai didi

c - 为什么int指针可以存储字符串?

转载 作者:行者123 更新时间:2023-11-30 21:01:03 25 4
gpt4 key购买 nike

我已经尝试了以下方法,但无法完成其背后的工作。

char *s;
s="hello";
printf("%s",s);

显然,这完美地打印了 hello。现在,如果我们使用以下代码,它也可以完美运行。

int *s="hello";
printf("%s", s);

这个的输出也是 hello。如果我们这样做 double *s="hello";,那也是可行的。谁能帮我解决这个问题并提供正确的解释?

最佳答案

首先,字符串不是存储在指针中的。相反,指针指向字符串的开头。字符串文字(例如“hello”)通常位于正在运行的进程的只读部分中的代码旁边。此外,使用强制转换运算符,char * 可以强制转换int *,反之亦然:

char *foo = "hello";
int *bar = (int*)foo;
foo = (char*)bar;

但是,在不进行强制转换的情况下在这些指针类型之间进行转换是不符合标准的;如此给出

char *foo;
int *bar;

这两种说法都不是

foo = bar;
bar = foo;

符合标准。

<小时/>

您的程序不严格符合要求;这无法以符合标准的方式完成。

C11 草案 n1570 附录 J.2 指出,如果出现以下情况,则行为未定义:

— Two pointer types that are required to be compatible are not identically qualified, or are not pointers to compatible types (6.7.6.1).

6.5.4.1 Cast 运算符说的是

Conversions that involve pointers, other than where permitted by the constraints of 6.5.16.1, shall be specified by means of an explicit cast.

6.5.16.1 然后说,无需强制转换,您就可以对兼容指针进行赋值,或者将指向 void 的指针分配给指向对象的指针,或者将指向对象的指针分配给指向 void 的指针。

现在,int *char * 不是指向兼容类型的指针,因此行为未定义。现在,未定义的行为定义为

1 undefined behavior

behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this International Standard imposes no requirements

2 NOTE

Possible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).

(强调我的)

使用默认设置,GCC 决定以记录的方式运行,发出诊断消息,但不终止翻译(编译):

test.c:1:8: warning: initialization from incompatible pointer type 
[-Wincompatible-pointer-types]
int *s = "hello";
^

可以使用 -Werror 开关将警告变成 fatal error ,该开关会终止翻译并发出诊断消息:

% gcc test.c -Werror
test.c:1:8: error: initialization from incompatible pointer type

[-Werror=incompatible-pointer-types]
int *s = "hello";
^
cc1: all warnings being treated as errors
<小时/>

即使使用默认设置编译时,GCC 仍然可以成功编译您的程序,但您的程序并不严格符合要求,因此无法最大程度地可移植。其他编译器和 GCC 的 future 版本可以使用默认开关终止翻译,或者无法生成工作代码。

关于c - 为什么int指针可以存储字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37223832/

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