user-0 提问: 哪儿来的野指针？

回复:
user: user-1
content: 引用 14 楼 sholber 的回复:[quote=引用 13 楼 lm_whales 的回复:] 严格来说，你的代码不够健壮，没有处理，只有一个参数 ，argv[1] 不存在的情况。 argv[0] 是程序名字，永远存在，argv[1] 必须从命令行传入。 windows 下，一种方式是控制台窗口中输入  文件名 参数 参数。。。。 这样处理。  在IDE中，需要设置命令行参数才能调试。 根据argc ，可以知道有几个命令行参数。  只有在argc大于0时，argv[0]才指向程序名，但这不是保证，更不用说“永远存在”了，因为，如果执行环境不能提供程序名，则argv[0]是空指针。 如果argc大于1，则argv[1]到argv[argc-1]是指向程序参数，由C的实现决定，不一定是啥。[/quote] 哦，这是标准么？ 请问何种情况下argv[0]不存在 固件代码，，，，操作系统，，，

user: user-2
content: char buffer[128];最好初始化一下！ 输入的文件名太长会出现问题啦！

user: user-3
content: int main(int argc,char *argv[]) {     if(argc < 2)     {         printf("没有输入文件\n");         return 0;     }     FILE *fp4;     char buffer[128];  开头加个这个

user: user-4
content: FILE * __cdecl _tfsopen (         const _TSCHAR *file,         const _TSCHAR *mode         ,int shflag         ) {     FILE *stream=NULL;     FILE *retval=NULL;      _VALIDATE_RETURN((file != NULL), EINVAL, NULL);

user: user-5
content: 你用的哪个ide？ vs 是在 工程属性里头. 有个调试，然后你在里面填上就好了 codeblocks 是在project -> setproject parameters里面

user: user-6
content: VC6：  工程、设置、Debug、U程序变量：填写命令行参数。 VS20XX：  项目、属性、配置属性、调试、命令参数：填写命令行参数。  /* 编写一个通用的显示磁盘文件内容的程序 */ #include <stdio.h> #include <stdlib.h>  int main(int argc,char *argv[]) { FILE *fp4; char buffer[128]; if (argc<2) {     printf("Usage: %s filename.ext\n",argv[0]);     exit(1); } if( (fp4 = fopen(argv[1],"r")) == NULL) //从命令行取文件名，打开文件 { printf("File [%s] can not be opened!\n",argv[1]); exit(1); } while(fgets(buffer,128,fp4)!=NULL)  //读一行字符 printf("%s",buffer); fclose(fp4);     /*关闭文件*/  return 0; }

user: user-7
content: 你是用VS直接调试->开始执行的吧，这样就是没有传入命令行参数的，你可以给生成的exe文件创建一个苦熬接方式，然后在目标那一行后面添加参数，也就是你要读取的文件的路径名，这样就可以了

user: user-8
content: if( (fp4 = fopen(argv[1],"r")) == NULL)      打开文件这行打一个断点，看一下打开的路径是否正确和fp4指针是否为空

user: user-9
content: buffer 读入 128 个字符后，没有结束符的位置

user: user-10
content: 断点调试啊，如果只靠浏览代码那找问题麻烦大啦

user: user-11
content: 没问题啊，我运行了一遍

user: user-12
content: 没有任何问题。

user: user-0
content: /* 编写一个通用的显示磁盘文件内容的程序 */ #include <stdio.h> #include <stdlib.h>  int main(int argc,char *argv[]) { 	FILE *fp4; 	char buffer[128]; 	if( (fp4 = fopen(argv[1],"r")) == NULL) //从命令行取文件名，打开文件 	{ 		printf("File cannot be opened\n"); 		exit(1); 	} 	while(fgets(buffer,128,fp4)!=NULL)  //读一行字符 		printf("%s",buffer); 	fclose(fp4);			/*关闭文件*/  	return 0; }

user: user-0
content: 引用 13 楼 lm_whales 的回复:严格来说，你的代码不够健壮，没有处理，只有一个参数 ，argv[1] 不存在的情况。 argv[0] 是程序名字，永远存在，argv[1] 必须从命令行传入。 windows 下，一种方式是控制台窗口中输入  文件名 参数 参数。。。。 这样处理。  在IDE中，需要设置命令行参数才能调试。 根据argc ，可以知道有几个命令行参数。恩恩，在cmd下，用你的格式，运行通过了，但是再ide下，找不到，设置参数的地方来调试啊。

user: user-0
content: 引用 11 楼 user-15 的回复:如果是vc编译的话，在Project->Setting的Program arguments项中输入参数，gcc的话在程序文件名后面添加要打开的文件名。你的野指针是argv[1]。我的编译器居然在Project->Setting中没有Program arguments项

user: user-0
content: 引用 7 楼 zyaiwx 的回复: #include <stdio.h> #include <stdlib.h>   int main(int argc,char *argv[]) {     FILE *fp4;     char buffer[128];     if( (fp4 = fopen(argv[1],"r")) == NULL) { //从命令行取文件名，打开文件         printf("File cannot be opened\n");         exit(1); 	} 	while(fgets(buffer,128,fp4)!=NULL)  //读一行字符 	    printf("%s",buffer); 	fclose(fp4);            /* 关闭文件*/ 	     return 0; }   你确保你输入文件名了？而且文件名路径正确。 我猜你可能没输入正确的文件路径作为参数 我的测试文件为在编译器编译链接之后，运行就直接弹错误框，根本来不及在命令行输入任何东西。

user: user-13
content: 引用 13 楼 lm_whales 的回复:严格来说，你的代码不够健壮，没有处理，只有一个参数 ，argv[1] 不存在的情况。 argv[0] 是程序名字，永远存在，argv[1] 必须从命令行传入。 windows 下，一种方式是控制台窗口中输入  文件名 参数 参数。。。。 这样处理。  在IDE中，需要设置命令行参数才能调试。 根据argc ，可以知道有几个命令行参数。  只有在argc大于0时，argv[0]才指向程序名，但这不是保证，更不用说“永远存在”了，因为，如果执行环境不能提供程序名，则argv[0]是空指针。 如果argc大于1，则argv[1]到argv[argc-1]是指向程序参数，由C的实现决定，不一定是啥。

user: user-1
content: 严格来说，你的代码不够健壮，没有处理，只有一个参数 ，argv[1] 不存在的情况。 argv[0] 是程序名字，永远存在，argv[1] 必须从命令行传入。 windows 下，一种方式是控制台窗口中输入  文件名 参数 参数。。。。 这样处理。  在IDE中，需要设置命令行参数才能调试。 根据argc ，可以知道有几个命令行参数。

user: user-14
content: 你没有传入你要打开的文件吧

user: user-15
content: 如果是vc编译的话，在Project->Setting的Program arguments项中输入参数，gcc的话在程序文件名后面添加要打开的文件名。你的野指针是argv[1]。