从另一个库的函数返回char *

时间:2018-04-06 07:57:20

标签: c++ memory char

在使用其他库函数时,我遇到了处理指针的问题

库有一个void函数,它通过引用成功修改long值,但是当试图修改char *的值时,函数结束时库的内存分配会丢失,让我无法读取存储器中。

我不知道函数将创建的char *的大小,所以我无法在它之前分配内存。

任何帮助?

EDIT1:发布一些代码示例 EDIT2:发布了2个解决方案 主程序:

char* resizedPixels = new char[2]; // random number to initialize it
long pixelsSizeRed;

//calling the method from another library
ImageResizer::reziseImg("C:\img.jpg", &resizedPixels, pixelsSizeRef);
// end of main program

在库方面,功能如下:

void resizeImg(char* inputPath, char** resizedPixels, long &pixelsSize){

    pixelsSize=100; //calculated with other methods, hands out the value correctly
    //now that I have the size, allocate memory on the char array I need
    *resizedPixels = new char[pixelsSize];

    //modify inputPath bytes, and passing them to resizedPixels
    char* buffer = "something manipulated";

    for (int i = 0; i < pixelsSize; ++i) {
        (*resizedPixels)[i] = buffer[i];
    }

}

解决方案2:使用向量

void resizeImg(vector<char>&, long );

int main() {
    vector<char> pixelVec;
    char* resizedPixels;
    long pixelsSizeRef;
    resizeImg(pixelVec, pixelsSizeRef);
    // for loop to pass value
    resizedPixels=new char[pixelsSizeRef];
    for(int i=0; i<pixelsSizeRef; i++){
       resizedPixels[i]=pixelVec.at(i);
    }
    //our char* has the values from library's function

    return 0;
}

void resizeImg(vector<char> &myVec, long pixelSize) {

    // modify your string
    pixelSize=10;
    char foo[pixelSize] = "abcdefghi";
    for (int i = 0; i < 10; ++i) {
        myVec.push_back(foo[i]);
    }
}

1 个答案:

答案 0 :(得分:1)

值丢失的原因是因为您尝试通过按值传递函数来修改函数中的指针(传递char*)。如果要在函数中修改它并将修改反映在它之外,则需要通过指针(所以char**)传递它。

以与考虑修改int的函数相同的方式考虑它。您需要在整数(int*)上传递指针,以便将修改反映在函数外部。在这里,您通过值传递char*,以便在函数中,构造一个类型char*的不同对象,并在其上完成所有操作。一旦退出该函数,就会破坏完成所有操作的对象,并且您从未实际触及过想要修改的调用程序块中的对象。

我编写了一个函数的最小功能代码,用于修改char*,如果你想相应地修改代码(把它放在.cpp文件中并运行它),你可以用它作为例子:

#include <iostream>

void resizeImg(char** myarray);

int main() {
    char* resizedPixels;
    resizedPixels = new char[5];
    for (int i = 0; i < 4; ++i) {
        resizedPixels[i] = i + 65;
    }
    resizedPixels[4] = '\0';
    std::cout << resizedPixels << std::endl;
    resizeImg(&resizedPixels);
    std::cout << resizedPixels << std::endl;
    return 0;
}

void resizeImg(char** myarray) {

    // allocate memory for your string 
    // (you can do that with your pixelSize, 
    // don't forget that the last char is '\0')
    *myarray = new char[10];

    // modify your string
    char foo[10] = "abcdefghi";

    for (int i = 0; i < 10; ++i) {
        (*myarray)[i] = foo[i];
    }
}

输出结果为:

ABCD
abcdefghi

这里,char*由指针传递,因此函数的原型需要char**。它实际上修改了调用者块中的字符串。