char 指向字符串的指针,然后进入字符串数组。 *** `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 ***

Posted

技术标签:

【中文标题】char 指向字符串的指针,然后进入字符串数组。 *** `./a.out\' 中的错误:malloc():内存损坏:0x0900c3b0 ***【英文标题】:char pointer to string, then into array of strings. *** Error in `./a.out': malloc(): memory corruption: 0x0900c3b0 ***char 指向字符串的指针,然后进入字符串数组。 *** `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 *** 【发布时间】:2015-04-03 17:25:04 【问题描述】:

我收到此错误: * `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 *

我正在尝试将 char 指针转换为字符串,然后将该字符串放入字符串数组中以备后用。我不明白为什么这不起作用。我假设我放入数组的字符串被删除了,这可能就是原因。

执行 new string(firstByte) 时发生错误

代码如下:

char *entries[16] = nullptr;


string *strEntries[16] = nullptr;
  char * firstByte = 0;
  stringstream s;
  size_t len;

  string sfB; 
  firstByte = new char[sizeof(char)];
  count = (FirstRootDirSec*512) + 32;
  lseek(fd, count, SEEK_SET); //Takes us to 32 bytes after root directory, or first entry

  //so either find a way to just read in one byte at a time, or 
  //take the first character of firstByte. firstbyte[0]. That's probably good.
  for(int i = 0; i<16; i++)
     //check first byte
     //if first byte is a 41 or 40, then it is a long directory, and then we can jump ahead 32 bytes, or 0x20


    lseek(fd, count, SEEK_SET); //Takes us to 32 bytes after
    read(fd, firstByte, count);
    count+=32;

    if(firstByte[2] != '\0')
      //then not a long entry, and we can put it in entries.
//       string str(firstByte);


      //error happens when I do new string(firstByte)
      **entries[i] = firstByte;
      strEntries[i] = new string(firstByte);
      cout<<entries[i]<<"blah"<<endl;**



【问题讨论】:

“我正在尝试将 char 指针转换为字符串” 你不能这样做。您可以使用const char*构造std::string。顺便说一句,这段代码太可怕了。 //error happens when I do new string(firstByte) - 在此之前很久就发生了很多错误。 停止到处使用指针。此外,您的 firstByte 指向 1 元素数组。 【参考方案1】:

你分配了一个足够大的数组来容纳一个字节:

firstByte = new char[sizeof(char)];

sizeof(char) 是一种相当复杂的写法1

然后您尝试将多个字节读入该数组:

read(fd, firstByte, count);

写出数组的末尾,并破坏堆。

看起来count 在这里读取的字节数错误,因为您刚刚使用相同的变量来设置文件中要查找的位置。你需要弄清楚每次你实际上想要读取多少字节,并确保你有一个足够大的数组。

【讨论】:

我没有在帖子中包含此内容,但 count 用作读取二进制文件的标记。这只是我遍历二进制文件的方式。您认为将整个原始文件复制到缓冲区中,然后处理缓冲区而不是进出我的文件会更好吗? @Tai:不,每次读你需要的数量。这显然与您当前在文件中的偏移量不同,因此不要尝试对两者使用相同的变量。

以上是关于char 指向字符串的指针,然后进入字符串数组。 *** `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 ***的主要内容,如果未能解决你的问题,请参考以下文章

数组名相当于一个指针,哪数组指针char *p[],不就变成一个二级指针?

如何在c中为指向char的指针数组分配内存

指向动态二维字符数组的三重指针的内存分配

指向结构数组的指针仅显示 char 字段的第一个字符

字符指针操作字符数组出错,代码如问题补充,

在 C# String 构造函数 String(Char*) 中,为啥构造函数不期望指向字符数组的指针?