gpt4 book ai didi

编译时没有段错误

转载 作者:IT王子 更新时间:2023-10-29 01:26:29 25 4
gpt4 key购买 nike

我正在使用来自 K&R 的示例,它是一个用于查看文件的 cat 实用程序

#include <stdio.h>

main(int argc,char **argv){
FILE *fp;
void filecopy(FILE *,FILE *);

if(argc==1)
filecopy(stdin,stdout);
else // accidentally mistyped
while(--argv > 0) // should have been --argc > 0
if((fp=fopen(*++argv,"r"))==NULL){
printf("cat: can't open %s\n",*argv);
return 1;
}else{
filecopy(fp,stdout);
fclose(fp);
}
return 0;
}
void filecopy(FILE *ifp,FILE *ofp)
{
int c;
while((c=getc(ifp))!=EOF)
putc(c,ofp);
}

当用 gcc cat.c 编译时,当我从终端运行 ./a.out cat.c 时,我得到的只是一些 chinnesse 符号和一些可读文本(名称如 _fini_array_、_GLOBAL_OFFSET_TABLE_ 等等),直到我按下 Ctrl+C 时,这些垃圾才会继续, 我想问为什么我没有得到 Segmentation fault,因为程序不是从 argv 起始地址读取每个内存位置吗?我不应该有这样做的权利吗?

最佳答案

让我们看一下这两行:

    while(--argv > 0)
if((fp=fopen(*++argv,"r"))==NULL){

每次你递减argv,你最终会在下一行递增它。所以总的来说,你只是递减和递增 argv 很多,但你实际上从来没有读过 argv 内存区域的边界。

即使您正在读取越过 argv 内存区域的边界,那也将是 undefined behavior并且不能保证您会遇到段错误。您获得的结果取决于您的编译器、操作系统和程序中的其他因素。

我怀疑执行 --argv 也会给你未定义的行为,因为在执行该行之后,指针可能指向分配给 argv 数据的数组之外.但是,由于您没有在它指向那里时取消引用 argv,所以结果没问题。

关于编译时没有段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28221451/

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