【问题标题】:Access violation in char double pointer programchar 双指针程序中的访问冲突
【发布时间】:2012-07-31 07:17:17
【问题描述】:

这段代码给了我运行时异常:Unhandled exception at 0x00401189 in ControlFileChanges.exe: 0xC0000005: Access violation writing location 0xbaadf00d at first strcpy 命令。

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;
}

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

【问题讨论】:

  • 这是疯狂的代码,即使它没有错。它绝对不是“C++”。

标签: c++ pointers char


【解决方案1】:

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

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

【讨论】:

  • 能否请您给我等效的 C++ 代码,用 new 而不是 malloc(仅用于将内存分配给管道,而不是分配给管道中的单个字符串)
  • @ShaileshTainwala C++ 中的等效代码根本不使用 new。您使用字符串向量,而 withStrings 函数根本不存在。
【解决方案2】:

常量0xbaadf00d 在这里告诉了我们很多信息。这表明您使用的是 Microsoft,您在调试模式下分配了一些堆内存并且没有初始化它。

您可以看到这一点 - 您已调用 malloc() 来创建您的 char**,但在调用 strcpy 之前,没有将每个 char* 指针单独设置为指向任何有效的东西。也就是说,由于char** 是一个指向指针的指针,因此char** 为您分配指向指针的指针,而不是它们指向的任何东西。

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

【讨论】:

    【解决方案3】:

    char** pipes; - 是一个指针数组,将存储 5 个字符串的地址。所以你已经在下面的语句中分配了内存来存储 5 个字符串的地址。

    管道 = (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 检查

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多