C 将字符串作为参数传递-在函数中获取segfault

C 将字符串作为参数传递-在函数中获取segfault,c,function-parameter,C,Function Parameter,已解决请参见问题的底部以获取解决方案 我在向函数传递字符串参数时遇到问题,并且在调用函数时遇到分段错误。程序接收命令行输入,并在验证后传递提供给函数的文件 我的函数代码如下所示: char *inputFile; // inputFile= argv[2]; strcpy(inputFile, argv[2]); compress(inputFile){ //file open and creation work bug-free //compression action to be wri

已解决请参见问题的底部以获取解决方案

我在向函数传递字符串参数时遇到问题,并且在调用函数时遇到分段错误。程序接收命令行输入,并在验证后传递提供给函数的文件

我的函数代码如下所示:

char *inputFile; //
inputFile= argv[2];
strcpy(inputFile, argv[2]);
compress(inputFile){ 

//file open and creation work bug-free
//compression action to be written
void compress(char inputFile){
    //compression code here
}
调用函数时,会抛出一个segfault,inputFile的值为0x00000000,而在调用函数之前,它有一个内存位置和测试文件路径的值

我尝试过的一些变体,包括匹配的函数原型:

compress(char *inputFile)
compress (char inputFile[])
我还更改了变量

为什么调试器中具有有效内存地址和值的变量用作参数时会突然擦除

编辑1:

结合这里的建议,我删除了inputFile=argv[2]行,调试器显示strcpy函数正在工作

但是,我已经尝试了每个Edwin Buck的compresschar*inputFile和每个展开的compressargv[2],这两种更改仍然导致无法访问地址0xBEB9C74C处的内存

奇怪的是我的文件验证函数checkFilechar inputFile[]与inputFile值一起工作,但是当我将相同的参数传递给compresschar inputFile[]函数时,我得到了segfault

编辑2-已解决

你知道,当你和教授纠缠45分钟时,发生了一些事情。结果是,我在compress方法中将文件读取缓冲区声明为5MB长的数组,这反过来又使堆栈帧达到最大。将缓冲区声明更改为全局变量完成了这项任务,代码将执行


谢谢你的帮助

您不应该写入用于保存argv[2]的内存

您似乎不太了解字符串是如何表示的;您正在复制带有赋值的指针和带有strcpy的实际字符


你应该只做压缩rgv[2];验证该参数是否有效后。

不应将其写入用于保存argv[2]的内存

您似乎不太了解字符串是如何表示的;您正在复制带有赋值的指针和带有strcpy的实际字符


你应该只做压缩rgv[2];验证该参数是否有效后。

您尚未分配任何内存供char*使用。您对char*inputfile所做的只是分配了一个指针。

您没有分配任何内存供char*使用。您对char*inputfile所做的一切都是分配一个指针。

首先,要将某个内容从argv[2]复制到其他地方,您需要一些内存用于其他地方。您可以根据argv[2]的大小分配内存,但对于我们的简单示例,一个非常大的固定大小缓冲区就可以了

char inputfile[2048];
看起来您试图通过赋值运算符执行此操作,但实际上并没有达到预期效果

// this is not the way to what you seek, as it doesn't create any new memory for inputfile
char* inputfile = argv[2];
在将inputfile变量传递给过程时,您希望传递的不仅仅是单个字符,因此不能选择void compresschar inputfile。剩下的

compress(char *inputFile)  // I prefer this one
compress (char inputFile[])

这两种方法都可以,但根据我的经验,第一种方法是首选的,因为一些较旧的编译器倾向于区分指针和数组语义。这些编译器在将数组转换为指针方面没有问题,这是C语言规范的一部分;但是,在这样的系统中,将指针投射到数组会有点混乱。

首先,要将argv[2]中的内容复制到其他地方,需要在其他地方使用一些内存。您可以根据argv[2]的大小分配内存,但对于我们的简单示例,一个非常大的固定大小缓冲区就可以了

char inputfile[2048];
看起来您试图通过赋值运算符执行此操作,但实际上并没有达到预期效果

// this is not the way to what you seek, as it doesn't create any new memory for inputfile
char* inputfile = argv[2];
在将inputfile变量传递给过程时,您希望传递的不仅仅是单个字符,因此不能选择void compresschar inputfile。剩下的

compress(char *inputFile)  // I prefer this one
compress (char inputFile[])

这两种方法都可以,但根据我的经验,第一种方法是首选的,因为一些较旧的编译器倾向于区分指针和数组语义。这些编译器在将数组转换为指针方面没有问题,这是C语言规范的一部分;然而,在这样的系统中,将指针投射到数组会有点混乱。

这不是从argv[2]复制的代码吗?左边的变量是对其进行任何操作的接收者。@Jason:请注意strcpy前面的行。@Jason它正在从argv[2]复制到inputFile,但前面的行将inputFile设置为argv[2],因此实际上您正在将自身复制到自身。即使您没有间接复制到argv[2],您仍然会遇到问题,因为提供的两个字符串重叠,并且传递给strcpy的两个字符串不能重叠。为什么您要从argv复制到argv,即使在argv中存储任何内容是有意义的?我知道了,但在调用函数时仍然抛出segfault
难道不是从argv[2]复制代码吗?左边的变量是对其进行任何操作的接收者。@Jason:请注意strcpy前面的行。@Jason它正在从argv[2]复制到inputFile,但前面的行将inputFile设置为argv[2],因此实际上您正在将自身复制到自身。即使您没有间接复制到argv[2],您仍然会遇到问题,因为提供的两个字符串重叠,并且传递给strcpy的两个字符串不能重叠。为什么您要从argv复制到argv,即使在argv中存储任何内容是合理的?我明白了,但是当调用函数时,我仍然抛出segfault。压缩函数是否在任何地方修改传递的参数?压缩函数是否在任何地方修改传递的参数?