繁体   English   中英

将字符串作为参数传递-在函数中获取段错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM