通过指针重新分配崩溃

通过指针重新分配崩溃

我好像找不到一个和我正在做的事情完全吻合的问题,所以来吧。下面是我的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';
  ...

这不可能是对的。如果t_buffer比原来的in长,那么您将在i_size结束后写作。你可能想在那里重置i,而不是i_size
然后,当您不能保证字符串函数正确地以空结尾时,您使用的是带t_buffer的字符串函数-您初始化了前1000个值,但覆盖了循环中的值。如果要使用strcat和friends,则需要更加小心,确保它保持空终止状态。但是使用memcpy会导致代码更简单,因为您知道所涉及的数组的长度。
for (x = 0; x < strlen(in); x++) {
  ...
  for (x = 0; x < 999; x++)
    ...
    t_buffer[x] = 0;

这也不可能是正确的,正如Useless所发现的那样。使用第二个变量,或者更好地使用memset

关于c - 通过指针重新分配崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13073078/

10-10 05:08