使用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;
这样,您就不必再为大小烦恼了,向量本身会自动增长到大小。     

要回复问题请先登录注册