风眠 发表于 2023-10-3 16:23:27

str[20]和20[str]

代码
#include <stdio.h>

int main() {
char str[] = "I love FishC.com!What about your?";

printf("%s \n%s\n", str, 20 );

return 0;
}
小甲鱼原话:2. 请问 str 是否可以写成 20?
答:可以。
结果:gcc test5.c && ./a.out
段错误 (核心已转储)

有哪位鱼油可以解释一下吗?

isdkz 发表于 2023-10-3 16:23:35

这段代码的问题出在printf函数的参数中。str和20都是单个字符,但是在printf函数的参数中使用了%s,它会尝试输出一个字符串,因此会出现段错误。

str表示字符串str中下标为20的字符,而20也可以表示相同的字符,因为在C语言中,str等价于*(str+20),而20等价于*(20+str),由于加法满足交换律,因此它们都可以表示字符串str中下标为20的字符。

陶远航 发表于 2023-10-3 16:24:10

首先,我们来解释一下代码中的两个表达式:str 和 20。

在 C 语言中,数组下标运算符 [] 的实际工作原理是通过指针运算来实现的。当我们使用 str 时,实际上是在执行 *(str + 20)。同样,20 实际上是在执行 *(20 + str)。由于加法运算是可交换的,所以这两个表达式是等价的。

然而,这段代码中存在一个问题,导致了段错误(segmentation fault)。段错误通常是由于程序试图访问非法内存区域而引发的。在这个例子中,str 是一个字符数组,其长度为 25(包括空字符 '\\0')。当我们尝试访问 str 或 20 时,我们实际上是在访问数组范围之外的内存,这可能导致段错误。

此外,printf 函数的格式字符串中使用了 %s,它期望接收一个以空字符 '\\0' 结尾的字符串指针。但是,str 和 20 都是字符类型(char),而不是字符串指针。这也可能导致未定义行为和段错误。

为了解决这个问题,你可以将代码修改为:

#include <stdio.h>

int main() {
    char str[] = \"I love FishC.com!What about your?\";
    printf(\"%c \
%c\
\", str, 20 );
    return 0;
}


这里,我们将 printf 的格式字符串中的 %s 改为 %c,以便正确地输出字符。这样,程序应该可以正常运行并输出两个字符。
如果问题已经解决,请设置最佳答案

风眠 发表于 2023-10-3 16:24:22

isdkz 发表于 2023-10-3 16:23
这段代码的问题出在printf函数的参数中。str和20都是单个字符,但是在printf函数的参数中使用了%s ...

等等,对诶!

风眠 发表于 2023-10-3 16:25:19

isdkz 发表于 2023-10-3 16:23
这段代码的问题出在printf函数的参数中。str和20都是单个字符,但是在printf函数的参数中使用了%s ...

抱歉,看到str就打了个%s

风眠 发表于 2023-10-3 16:27:07

陶远航 发表于 2023-10-3 16:24
首先,我们来解释一下代码中的两个表达式:str 和 20。

在 C 语言中,数组下标运算符 [] 的实际工 ...

感谢你的回答{:10_279:}
——但为什么我没看到{:10_244:}!!!
诶,也对只有刷新才看得到......{:10_284:}

陶远航 发表于 2023-10-3 16:27:48

风眠 发表于 2023-10-3 16:27
感谢你的回答
——但为什么我没看到!!!
诶,也对只有刷新才看得到......{:10 ...

没事没事

风眠 发表于 2023-10-3 16:29:17

陶远航 发表于 2023-10-3 16:27
没事没事

对了为什么我收到了提示
屏蔽3 分钟前
Mike_python小 回复了您的帖子 str和20   查看
但我这儿看不到他的消息呢?

陶远航 发表于 2023-10-3 16:30:05

风眠 发表于 2023-10-3 16:29
对了为什么我收到了提示
但我这儿看不到他的消息呢?

不知道

风眠 发表于 2023-10-3 16:31:43

这个:

风眠 发表于 2023-10-3 16:32:14

算BUG吗?

陶远航 发表于 2023-10-3 16:33:26

风眠 发表于 2023-10-3 16:32
算BUG吗?

他脚本没调试好吧{:10_277:}

风眠 发表于 2023-10-3 16:34:03

陶远航 发表于 2023-10-3 16:33
他脚本没调试好吧

什么意思?

陶远航 发表于 2023-10-3 16:34:56

风眠 发表于 2023-10-3 16:34
什么意思?

没事,就是一个Bug而已

风眠 发表于 2023-10-3 16:37:12

好的,已经去问了

liuhongrun2022 发表于 2023-10-3 16:51:13

风眠 发表于 2023-10-3 16:37
好的,已经去问了

他可能删了

陶远航 发表于 2023-10-3 16:58:52

liuhongrun2022 发表于 2023-10-3 16:51
他可能删了

为啥要删呢
页: [1]
查看完整版本: str[20]和20[str]