测试环境为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++;
}