我已经在几天内遇到了一些c代码的问题,我到处都看,但我不确定如何修复它而且它让我抓狂!基本上会发生的是函数_getfile()
从argv[1]
获取相对/绝对文件路径(假设它可用)并检查是否存在绝对文件路径以及文件是否可以打开和读取。然后,该函数将该文件路径返回给main,并将其存储为const char*
。到目前为止,一切正常。没有数据丢失或问题。但是一旦我将filepath
传递给任何其他函数,我的程序就会开始做疯狂的事情。 filepath
要么变成了一堆\n
个字符,要么就是其中的一部分。
这是代码:
#include <limits.h> //PATH_MAX
#include <unistd.h> //access()
#include <stdio.h>
#include <stdlib.h>
const char* _getfile(int argcount, const char ** argvars) {
//Check if filepath has been given as console parameter
if (argcount == 1) {
exit(EXIT_FAILURE);
}
//Get absolute path of given filepath
const char* relpath = argvars[1];
char buffer[PATH_MAX + 1];
const char* abspath = realpath(relpath, buffer);
//Check if an absolute path could be found
if (abspath) {
printf("Source at '%s'.\n", abspath);
} else {
printf("No absolute filepath could be found for '%s'.\n", relpath);
exit(EXIT_FAILURE);
}
//Check if file exists
if(access(abspath, F_OK) != -1) {
//Check file for read permissions
if (access(abspath, R_OK) != -1) {
return abspath;
} else {
printf("'%s' couldn't be accessed as it lacks read permissions.\n", abspath);
exit(EXIT_FAILURE);
}
} else {
printf("'%s' doesn't exist.\n", abspath);
exit(EXIT_FAILURE);
}
}
void _readfile(const char* filename) {
//'filename' has now been changed!
FILE* file = NULL;
file = fopen(filename, "r");
/*
Read/print file contents etc.
...
*/
int main(int argc, const char** argv) {
const char* filepath = _getfile(argc, argv);
_readfile(filepath);
return 0;
所以说我在控制台中传递"/Users/Token/Desktop/Test.txt"
作为参数。当绝对文件路径返回main时,即"/Users/Token/Desktop/Test.txt"
,一切都很好。当我将它传递给_readfile()
时,在函数内部,文件路径现在类似于"\n\n\n\n\n\n..."
或"/Users/To"
,其余部分都丢失了。它看起来像是一个记忆泄漏给我,但我无法找到我做错的事情。我上次检查调试器时,buffer
似乎在我的机器上保留了1025个字符,因此无法解决问题。我不认为这很重要,但我在OS X El Capitan 10.11.13上使用XCode。提前感谢所有帮助!
答案 0 :(得分:2)
realpath解析传递给它的字符串,并将输出存储在作为第二个参数传递的缓冲区中
motionEnded:withEvent:
这是代码中的局部变量。当一个数组放入堆栈时,一旦函数返回就尝试访问它就变得非法,并且它在调用者甚至接触到希望返回但消失的东西之前发生。
解决方案:
将结果字符串的预分配缓冲区传递给_getfile:
char buffer[PATH_MAX + 1];
const char* abspath = realpath(relpath, buffer);
// ^^^
// in your case here
答案 1 :(得分:1)
您正在尝试返回本地指针。这将永远不会工作,因为当函数超出范围时,所有局部变量都将被销毁。因此,您看到的返回值将具有垃圾。
你可以做以下两件事之一:
答案 2 :(得分:0)
您使用realpath
调用buffer
,_getfile
是NULL
函数中本地分配的变量。当你从函数返回时它会被破坏并且它不再有效。因此,你在这里得到了奇怪的价值。使用realpath
作为free
调用的第二个参数,因此您将获得指向新分配的缓冲区的指针。使用它之后不要忘记CKEDITOR.on('dialogDefinition', function (ev) {
var dialogName = ev.data.name;
var dialog = ev.data.definition.dialog;
var dialogDefinition = ev.data.definition;
if(dialogName == 'link') {
dialogDefinition.onLoad = function () {
if(dialogName == 'link'){
dialogDefinition.getContents('target').get('linkTargetType')['default']='_blank';
}
dialog.hidePage( 'target' );
};
}
});
//And configure the below
config.removeDialogTabs = 'image:advanced;link:advanced;link:upload;';
它。