【发布时间】:2011-04-13 14:41:16
【问题描述】:
我编程很糟糕已经有一段时间了,我才真正意识到。我之前创建了许多将字符串作为 char 数组(或至少指向它们的指针)返回的函数。
前几天有人指出,当我的函数返回时,我的函数指向的 char 数组已经超出范围,我现在基本上指向的是随机的内存位(一个讨厌的悬空指针)。
我有一段时间没有真正注意到这一点,因为输出到控制台时的 char 数组似乎没有损坏(可能是因为没有时间覆盖该数据)。然而,当我返回一个通过读取经常损坏的串行端口生成的字符串缓冲区(字符数组)时,我确实注意到了这一点。
那么,我应该如何做到最好?
我的错误代码如下:
#include <cstdlib>
#include <iostream>
using namespace std;
char* myBadFunction(){
char charArray[] = "Some string\n";
char* charPointer = charArray;
return charPointer;
}
int main(int argc, char** argv) {
cout << myBadFunction();
return 0;
}
我知道我可能应该在调用函数之前在程序中分配内存,或者创建一个全局变量来放入返回的字符串,但是如果我调用的函数被许多不同的程序使用,它应该如何知道函数的大小缓冲区被提前传入,什么时候应该删除这个内存?
以下代码也没有按照我的意愿正确执行:
#include <cstdlib>
#include <iostream>
using namespace std;
void fillArray(char* charPointer){
char charArray[] = "Some string\n"; // Create string
charPointer = charArray; // Not correct, want to fill predefined array with created string
return;
}
int main(int argc, char** argv) {
char predefinedArray[50] = {0};
fillArray(predefinedArray);
cout << predefinedArray;
return 0;
}
我想填充指针解析指向的数组,但这不会发生在上面的代码中。
另外,我什么时候应该使用 new[] 命令来创建我的数组?需要吗?我应该什么时候调用 delete[] 。
非常感谢,这显然是非常基本的,但我一直做错了一段时间。
【问题讨论】:
-
你最好在标签中添加你写的那种代码。
-
关于问题的第二部分,您必须使用手动循环并将每个字符复制到第二个数组中或使用
memcpy...