将const char *传递给函数

时间:2016-02-18 20:35:03

标签: c function memory-leaks char const

我已经在几天内遇到了一些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。提前感谢所有帮助!

3 个答案:

答案 0 :(得分:2)

realpath解析传递给它的字符串,并将输出存储在作为第二个参数传递的缓冲区中

motionEnded:withEvent:

这是代码中的局部变量。当一个数组放入堆栈时,一旦函数返回就尝试访问它就变得非法,并且它在调用者甚至接触到希望返回但消失的东西之前发生。

解决方案:

将结果字符串的预分配缓冲区传递给_getfile:

char buffer[PATH_MAX + 1];
const char* abspath = realpath(relpath, buffer);
//                                       ^^^
//                                in your case here

答案 1 :(得分:1)

您正在尝试返回本地指针。这将永远不会工作,因为当函数超出范围时,所有局部变量都将被销毁。因此,您看到的返回值将具有垃圾。

你可以做以下两件事之一:

  1. 在函数中添加一个带有返回值的参数。
  2. 在堆中定义返回值。 (这是一种糟糕的方法,因为一般来说,调用代码负责分配和释放堆内存。如果你在这个函数中分配了内存,并在外面解除分配,那么它的编程很糟糕:))

答案 2 :(得分:0)

您使用realpath调用buffer_getfileNULL函数中本地分配的变量。当你从函数返回时它会被破坏并且它不再有效。因此,你在这里得到了奇怪的价值。使用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;'; 它。

相关问题