在使用其他库函数时,我遇到了处理指针的问题
库有一个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]);
}
}
答案 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**
。它实际上修改了调用者块中的字符串。