所以我试图修改一个开源的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"
是什么给出的?通常我会尽量避免询问这些具体问题,但这次我真的很难过。