使用malloc时触发异常

时间:2014-05-22 14:05:55

标签: c memory-management

我正在尝试在字符串中的两个字符之间添加空格的程序,我的程序适用于第一个测试用例,但是会触发下一个的例外,请帮助我

#include<stdio.h>
#include<conio.h>
#include "stdlib.h"
#include "ctype.h"
#include "string.h"
struct test {
    char input[20];
    char output[20];
} testDB[12] = { { "A B C", "A B C" },
{ " abc ", "a b c" },
{ "A b C", "A b C" },
{ "123", "1 2 3" },
{ "", "" },
{ "   a1B2c", "a 1 B 2 c" },
{ "a    b c", "a b c" },
{ "!@#$", "! @ # $" },
{ "A!@b", "A ! @ b" },
{ "    ", "" },
};
void remove_space(char *inp)
{
    int i = 0, ch, j = 0, k = 0;
    while (inp[i])
    {
        ch = inp[i];
        if (ch == ' ')
        {
            j = i + 1;
            while (inp[j] == (' '))
            {
                j++;
            }
            inp[k] = inp[j];
            k++;
            i = j + 1;
        }
        else
        {
            inp[k] = inp[i];
            k++;
            i++;
        }
    }
    inp[k] = '\0';
    return;
}
void add_space(char *inp)
{
    int i = 0, j;
    while (inp[i])
    {
        i++;
    }
    inp = (char *)realloc(inp,sizeof(char)*(i));
    j = 2 *( i - 1);
    inp[j + 1] = '\0';
    while (i>0 && j>0)
    {
        i--;
        inp[j] = inp[i];
        j--;
        inp[j] = ' ';
        j--;
    }

    return;
}
void testCases()
{
    int i;
    char * inp[10];
    for (i = 0; i < 10; i++)
    {
        inp[i] = (char *)malloc(sizeof(char)*(strlen(testDB[i].input)+1));
        strcpy(inp[i], testDB[i].input);
        remove_space(inp[i]);
        add_space(inp[i]);
        if (strcmp(inp[i], testDB[i].output) == 0)
            printf("PASSED\n");
        else
            printf("FAILED\n");
    }
    return;
}
int main()
{  
testCases();
getch();
return 0;
}

1 个答案:

答案 0 :(得分:1)

最关键的问题(如指出n.mMichael Walz正在重新调整inp的大小:

    inp = (char *)realloc(inp,sizeof(char)*(i));

首先,当i为零时,零作为新大小传递给realloc()realloc(inp, 0);的记录行为等同于free(inp);。这意味着对inp指向的(现在释放的)内存的任何额外访问都可能导致问题;包括分段错误等。如下行:

     inp[j + 1] = '\0'; 

如果inp == NULL

,上述行是一件坏事

以下是realloc()行的替代品:

{
...
char   *tmp;
size_t  inpLen=strlen(*inp);

tmp = realloc(*inp, (inpLen * 2) + 1);
if(NULL == tmp)
   /* handle the error. */
inp=tmp;
...
}

查看我的完整版问题代码here