试图写入realloc'd内存时的Segfault?

时间:2016-03-30 02:03:57

标签: c memory

所以我试图修改一个开源的zork引擎来破解一些文本转语音功能,并且我必须在它们进来时记录一些字符串。我决定用一个简单的(和有点儿)愚蠢的)realloc - 基于字符串附加方法,令我惊讶的是,它立即失败了。这是我的代码:

#include "../common/frotz.h"

// frotz.h contains 'typedef unsigned char zchar;'

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// Length of the message, including '\0'
static size_t buf_len = 0;
static zchar* buf = NULL;

static inline zchar* get_buf() {
  if (!buf) {
    buf = malloc(10000);
    buf_len = 10000;
    buf[0] = '\0';
  }
  return buf;
}

void speech_add_string(zchar* str)
{
  if (!strlen(str))
    return;

  zchar* buf = get_buf();
  size_t old_len = buf_len;

  buf_len += strlen(str);
  buf = realloc(buf, buf_len);

  strcpy(buf[old_len - 1], str);  // <-- Failure happens here
}

LLDB表示:

(lldb) frame info var
frame #3: 0x00000001000197d5 frotz`speech_add_string(str="RK") + 133 at buf.c:31
(lldb) print buf
(zchar *) $0 = 0x00000001005012f0 ""
(lldb) print old_len
(size_t) $1 = 1
(lldb) print str
(zchar *) $2 = 0x000000010001bf24 "RK"

是什么给出的?通常我会尽量避免询问这些具体问题,但这次我真的很难过。

0 个答案:

没有答案