如何解决使用strcpy获取char *的部分会导致程序崩溃
|| 我试图从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;
这样,您就不必再为大小烦恼了,向量本身会自动增长到大小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。