问题描述
||
我试图从char *中获取位,然后将其存储在地图中。我使用strcpy和strncpy做到了这一点,但是当我去使用strncpy时,我的程序崩溃了(它可以编译,但在运行时崩溃)。
为什么我的程序崩溃了?如何从char *中成功获取位并将其存储在地图中?
编辑:征求意见后,我已经初始化了char *,但仍然崩溃?
// I did the following
char* variable = \"\";
char* value = \"\";
map <string,string> GetEvironmentvariablesEx()
{
map <string,string> envVariables;
char* environVar = GetEnvironmentStrings();
char* pos = strchr( environVar,\'\\0\' );
// This is what environVar contains: environVar = \"=::=::\\0APPDATA=c:/users/user1/desktop\\0OS=windowsNT\\0\\0\"; // note the string is double null terminated
// Skip over the \"=::=::\\0\" of the environVar string
if ( pos != NULL ) { environVar = ++pos; pos = strchr( environVar,\'\\0\' ); }
else return envVariables;
while ( true )
{
char* delim = strchr( environVar,\'=\' );
char* variable;
char* value;
if ( delim == NULL ) { printf(\"Environment variable string is badly formatted\"); break; }
// The crash occurs at the below line: the crash occurs at runtime
strncpy( variable,environVar,strlen(delim) );
strcpy( value,environVar+strlen(delim) );
printf( \"Variable is: %s = %s \\n\",variable,value );
envVariables.insert( pair<string,string>(string(variable),string(value)) );
environVar = ++pos;
// find the \"\\0\\0\" that identifies the end of environVar
if ( pos != NULL && *pos == 0 ) { break; }
pos = strchr( environVar,\'\\0\' );
}
FreeEnvironmentStrings( environVar );
return envVariables;
}
解决方法
崩溃是由于以下原因:
char* variable; // un allocated or uninitialized
char* value; // un allocated or uninitialized
最好的方法是使用std::string
。例如
std::string variable,value;
variable = environVar;
value = environVar + strlen(delim);
在旁注中,遇到以下情况时,应从函数中将“ 4”(或作为错误处理):
if ( delim == NULL )
, 我看到您正在将String-Copy(strncpy
)转换为variable
。
variable
被声明为char*
,但是我看不到您为其分配了任何内存,或以其他方式为variable
分配了一个值。
结果,“ 7”包含一个随机的存储器地址,并且您正在将“ 12”的一部分复制到未知的存储器中,从而导致崩溃。
要解决此问题,应在调用strncpy
之前使用malloc
向variable
分配一些内存。
编辑:您最近的更改后,您的代码现在有:
char* variable = \"\";
然后:
char* variable;
variable
的第二个声明仍未初始化,并隐藏(阴影)第一个声明。因此,您根本没有解决问题。
当我建议使用malloc
分配内存时,这就是我在说的:
variable = malloc(strlen(delim));
strncpy( variable,environVar,strlen(delim) );
请注意,无论何时分配内存,例如使用malloc
,都必须准备好在完成后释放它。否则您的程序将发生内存泄漏。
, char* variable;
char* value;
您需要动态地为此分配内存或将其设置为堆栈上的数组,然后再将任何数据复制到其中。这些只是指针,它们没有任何内存可以选择将任何数据输入。
要将char *转换为要添加到地图的字符串,请使用:
char* data = ...;
int size = ...;
std::string myString(data,size);
编辑:理想情况下,您应该使用vector
来管理您的字符串,而不必担心动态分配或事先不知道字符串的最大大小的麻烦。
vector<char>value;
vector<char>variable;
这样,您就不必再为大小烦恼了,向量本身会自动增长到大小。