[英]Passing String as argument- getting segfault in function
已解决请参阅问题底部的解决方案。
我在将String参数传递给函数时遇到麻烦,并且在调用函数时遇到了分段错误。 该程序接受命令行输入,并在验证后传递提供给函数的文件。
我的功能代码如下:
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
函数的工作inputFile= argv[2]
。
但是,我已经尝试了每个Edwin Buck的compress(char *inputFile)
和每个unwind的compress(argv[2])
,并且这两个更改仍然导致Cannot access memory at address 0xBEB9C74C
奇怪的是我的文件验证功能checkFile(char inputFile[])
与inputFile
值一起使用,但是当我将相同的参数传递给compress(char inputFile[])
函数时,我得到了segfault。
编辑2-已解决
您知道当教授绊倒45分钟时,情况正在发生变化。 事实证明,我在compress()方法中声明了文件读取缓冲区为5MB长的数组,从而使堆栈帧最大。 将缓冲区声明更改为全局变量可以解决问题,并执行代码。
谢谢您的帮助!
您不应该写入用于保存argv[2]
内存。
您似乎不太了解字符串的表示方式。 您正在复制指针(带有赋值)和实际字符(带有strcpy()
)。
您应该只做compress(argv[2]);
一旦您确认该参数有效。
首先,要将某些内容从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 compress(char inputfile)
不是一个选择。 那离开
compress(char *inputFile) // I prefer this one
compress (char inputFile[])
两者都有效,但以我的经验,首选第一个,因为一些较旧的编译器倾向于在指针语义和数组语义之间进行区分。 这些编译器将数组转换为指针没有问题(这是C语言规范的一部分)。 但是,在这样的系统中,将指针转换为数组会有些混乱。
您尚未分配任何内存供char *使用。 使用char * inputfile完成的所有操作都分配了一个指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.