字符双指针程序中的访问冲突

Access violation in char double pointer program

本文关键字:访问冲突 程序 指针 字符      更新时间:2023-10-16

这段代码给了我运行时异常:在第一个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;
}

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

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

由于这是C++而不是 C,您是否考虑过使用 new 而不是 malloc ?或者也许使用vectorstring

常数0xbaadf00d在这里告诉我们很多。它表示您正在使用Microsoft,您已在调试模式下分配了一些堆内存,但未启动它。

您可以看到这一点 - 您已经调用malloc()来制作char**,但在调用strcpy之前没有单独设置每个char*指针以指向任何有效内容。也就是说,因为char**是一个指针指向指针,只分配char**分配指向指针的指针,而不是它们指向的任何指针。

如果可以的话,我建议完全避免使用C字符串。

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