gpt4 book ai didi

c - Realloc 在传递的指针上崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 06:04:27 24 4
gpt4 key购买 nike

我似乎找不到与我正在做的完全匹配的问题,所以这里开始吧。下面是我的 C 应用程序的简化版本,具体到问题所在。我知道这是丑陋的代码并且缺少一些错误检查,但这只是让我弄清楚这个问题。就目前而言,下面的示例应该将所有“A”转换为“BCDE”。代码中的注释描述了这个问题。 (先执行runMe)

int runMe2(char *in, char **buffer) {
long x;
long b_size = 0;
long i_size = 1000;
long i = 0;
char t_buffer[1006];

// Initial malloc small as it will grow
*buffer = (char *)malloc(2*sizeof(char));
strcpy(*buffer, "");
for (x = 0; x < 999; x++)
t_buffer[x] = 0;
for (x = 0; x < strlen(in); x++) {
if (i >= i_size) {
char *r_buffer;
b_size = b_size + 1006*sizeof(char);
i_size = 0;
// Here is where the problem is.
// The first time through, i=1000, b_size=1006 and everything is fine
// The second time throgh, i=1004, b_size=2012 and the heap crashes on the realloc
r_buffer = (char *)realloc(*buffer, b_size);
if (r_buffer == NULL)
exit(0);
*buffer = r_buffer;
strcat(*buffer, t_buffer);
for (x = 0; x < 999; x++)
t_buffer[x] = 0;
}
if (in[x] == 'A') {
t_buffer[i++] = 'B';
t_buffer[i++] = 'C';
t_buffer[i++] = 'D';
t_buffer[i++] = 'E';
}
}
}

int runMe() {
char *out;
char in[30000];
int x = 0;

// Set up a 29,999 character string
for (x = 0; x < 30000; x++)
in[x] = 'A';
in[29999] = 0;
// Send it as pointer so we can do other things here
runMe2(in, &out);
// Eventually, other things will happen here
free(out);
}

最佳答案

if (i >= i_size) {
...
i_size = 0;
...
}
if (in[x] == 'A') {
t_buffer[i++] = 'B';
...

这不可能是对的。如果 in 比原来的 i_size 长,您将写到 t_buffer 的末尾。您可能打算在那里重置 i,而不是 i_size

然后,当您不能保证它正确地以 null 终止时,您将使用带有 t_buffer 的字符串函数 - 您初始化前一千个值,但在循环中覆盖它们。如果你打算使用 strcat 和 friend ,你需要更加小心以确保它保持空终止。但是使用 memcpy会导致更简单的代码,因为您知道所涉及的数组的长度。

for (x = 0; x < strlen(in); x++) {
...
for (x = 0; x < 999; x++)
...
t_buffer[x] = 0;

这也不对,正如 Useless 所发现的那样.为此使用第二个变量,或者更好地使用 memset .

关于c - Realloc 在传递的指针上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com