这段代码在第一个strcpy命令中给出了运行时异常:Unhandled exception at 0x00401189 in ControlFileChanges.exe: 0xC0000005: Access violation writing location 0xbaadf00d
。
char** withStrings(string s1, string s2, string s3, string s4, string s5)
{
char** pipes;
pipes = (char**) malloc(sizeof(*pipes)*5);
strcpy(pipes[0],s1.c_str());
strcpy(pipes[1],s2.c_str());
strcpy(pipes[2],s3.c_str());
strcpy(pipes[3],s4.c_str());
strcpy(pipes[4],s5.c_str());
return pipes;
}
知道问题可能是什么? (这是我在实际代码中使用类似逻辑的示例)。
答案 0 :(得分:7)
您没有为pipes[0]
,pipes[1]
等分配内存
由于这是C ++而不是C,您是否考虑使用new
代替malloc
?或者可以使用vector
或string
s?
答案 1 :(得分:2)
常数0xbaadf00d
在这里告诉了我们很多。它表明您正在使用Microsoft,您已经在调试模式下分配了一些堆内存,而不是将其初始化。
您可以看到这一点 - 您已调用malloc()
来制作char**
,但未在调用{{1}之前单独设置每个char*
指针以指向任何有效内容}。也就是说,因为strcpy
是一个指向指针的指针,只指定char**
指定指针指针,但没有指向它们的任何东西。
如果你能建议我完全避免使用C字符串。
答案 2 :(得分:0)
char** pipes;
- 是一个指针数组,用于存储5个字符串的地址。所以你已经在下面的语句中分配了用于存储5个字符串地址的内存。
pipes =(char **)malloc(sizeof(* pipes)* 5);
在此之后你必须分配内存来存储每个字符串。因此,请更新您的代码,如下所示。
#define MAX_NO_STRING 5
#define MAX_STR_SIZE 50
pipes = (char**) malloc(sizeof(char*)*MAX_NO_STRING);
for(i = 0; i < MAX_NO_STRING; i++)
{
pipes[i] = (char*)malloc(sizeof(char) * MAX_STR_SIZE);
}
注意:处理malloc
的NULL检查