使用 memset 将其设置为 0 后字符串数组不可用
String array unusable after setting it to 0 using memset
我有一个 class 属性,它是一个字符串数组 (std::string command[10]
)。当我为它分配一些字符串值时,它会停止程序执行。正如您在下面看到的,我有一个字符串变量 tempCommandStr
,我将其分配给 属性。我不知道可能是什么错误,但我有赋值后的打印语句,它从未执行过,而它前面的语句是。
//Declared in class header
std::string command[10];
// Part of function which is causing problem.
string tempCommandStr(commandCharArray);
printf("%s\n", tempCommandStr.c_str()); // Prints fine.
this->command[i] = tempCommandStr; // Something goes wrong here. i is set to some correct value, i.e. not out of range.
printf("%s\n", this->command[i].c_str()); // Never prints. Also program stops responding.
// I noticed that getting any value from the array also stops the execution.
// Just the following statement would stop the program too.
printf("%s\n", this->command[i].c_str());
不只是这个属性,我还有一个数组也有同样的问题。是什么原因造成的?到底出了什么问题(看看编辑)?还有其他更好的方法吗?
我是 运行 MBED 上的程序,所以我限制了调试选项。
编辑:
我发现了问题,在使用 memset(command, 0, sizeof(command));
删除任何以前的值之前,我正在清理数组。这是导致问题的原因。现在我对数组中的每个项目使用 clear
函数,如下所示。这解决了执行问题。
for (int i = 0; i < sizeof(command)/sizeof(*command); i++){
command[i].clear();
}
问题:为什么使用memset
将字符串数组设置为0会导致无法使用?
Why does setting the string array to 0 using memset makes it unusable?
因为您要删除字符串 class 中保存的值,所以将它们全部覆盖为 0。 std::string
有指向存储字符串、字符计数信息等的内存的指针。如果将 memset() 所有这些设置为 0,它将无法工作。
您来自错误的默认位置。 'zeroing out' 内存有意义(甚至 有用 )操作的类型是特殊的;你不应该指望做这样的事情会带来任何好处,除非这种类型是专门设计用来处理这种事情的。
我有一个 class 属性,它是一个字符串数组 (std::string command[10]
)。当我为它分配一些字符串值时,它会停止程序执行。正如您在下面看到的,我有一个字符串变量 tempCommandStr
,我将其分配给 属性。我不知道可能是什么错误,但我有赋值后的打印语句,它从未执行过,而它前面的语句是。
//Declared in class header
std::string command[10];
// Part of function which is causing problem.
string tempCommandStr(commandCharArray);
printf("%s\n", tempCommandStr.c_str()); // Prints fine.
this->command[i] = tempCommandStr; // Something goes wrong here. i is set to some correct value, i.e. not out of range.
printf("%s\n", this->command[i].c_str()); // Never prints. Also program stops responding.
// I noticed that getting any value from the array also stops the execution.
// Just the following statement would stop the program too.
printf("%s\n", this->command[i].c_str());
不只是这个属性,我还有一个数组也有同样的问题。是什么原因造成的?到底出了什么问题(看看编辑)?还有其他更好的方法吗?
我是 运行 MBED 上的程序,所以我限制了调试选项。
编辑:
我发现了问题,在使用 memset(command, 0, sizeof(command));
删除任何以前的值之前,我正在清理数组。这是导致问题的原因。现在我对数组中的每个项目使用 clear
函数,如下所示。这解决了执行问题。
for (int i = 0; i < sizeof(command)/sizeof(*command); i++){
command[i].clear();
}
问题:为什么使用memset
将字符串数组设置为0会导致无法使用?
Why does setting the string array to 0 using memset makes it unusable?
因为您要删除字符串 class 中保存的值,所以将它们全部覆盖为 0。 std::string
有指向存储字符串、字符计数信息等的内存的指针。如果将 memset() 所有这些设置为 0,它将无法工作。
您来自错误的默认位置。 'zeroing out' 内存有意义(甚至 有用 )操作的类型是特殊的;你不应该指望做这样的事情会带来任何好处,除非这种类型是专门设计用来处理这种事情的。