char双指针程序中的访问冲突

时间:2012-07-31 07:17:18

标签: c++ pointers char

这段代码在第一个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;
}

知道问题可能是什么? (这是我在实际代码中使用类似逻辑的示例)。

3 个答案:

答案 0 :(得分:7)

您没有为pipes[0]pipes[1]等分配内存

由于这是C ++而不是C,您是否考虑使用new代替malloc?或者可以使用vectorstring 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检查