c指针做函数参数

测试环境为centos7 ,gcc 版本4.8.3

指针作为函数参数

测试代码

cat.c
#include <stdio.h>
void
main(int argc, char **argv)
{
    FILE *fp;
    int ch;
    char *path;
    if (argc == 1) {
            fp = stdin;
            while (ch = getc(fp)) {
                    if (ch != EOF)
                            putc((int) ch, stdout);
            }
    } else {

            while (*++argv) {

                    fp = fopen(*argv, "r");
                    if (!fp)
                            printf("open error");
                    else
                            while (ch = getc(fp)) {
                                    if (ch != EOF)
                                            putc(ch, stdout);
                                    else {
                                            close(fp);
                                            break;
                                    }
                            }
            }
    }
    return;
}

本程序功能是打印文本内容,类似linux系统的cat命令。

    gcc -o cats cat.c

执行命令 ./cats cat.c cat2.c 可以正常打印多个文本

以下程序使用了行缓冲

cat2.c
#include <stdio.h>
int main(int argc, const char **argv)
{
    FILE *fp;
    char *buf;
    while (*++argv)
    {

            printf("%s\n",*argv);
            fp = fopen(*argv, "r");
            if (!fp){
                    printf("open error\n");
                    return -1;
            }
            while (fgets(buf,4096,fp))
                    fputs(buf,stdout);
            close(fp);

    }
    return 1;
}

该程序功能和第一个类似,但是执行 ./cat2 cat.c cat2.c 会出现段错误

    该程序错误在 char *buf;这句 只申明了指针变量,没有申请内存空间
    打印第一行文本就产生了未知错误,修改了argv的值。
    改为 char buf[4096]; 程序可正确执行。

指针越界问题

测试代码如下

#include <stdio.h>
int main(){
    extern char **environ;
            while (*environ++){
                printf("%s\n",*environ);
        }
        return 0;
    }

该程序打印系统的环境变量
环境变量指针 environ 最后一个变量为null;
该程序执行打印出所有环境变量以后会出现段错误
经研究发现问题出在

    while (*environ++)
这是因为environ自增越界了
改为:
while (*environ){
    environ++;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值