strcat使崩溃程序(0xc0000005)

时间:2014-12-19 12:15:21

标签: c string pointers for-loop strcat

我需要画出一行符号。所以我为此目的编写了一个函数:

void fDrawLine(int length)
{
    int i;
    char * compLine = (char *) malloc(WINDOW_WIDTH + 2);

    for(i = 0; i < length; i++)
        strcat(compLine, "-");

    fDrawSpacedMessage(compLine, -1, TRUE);
}

WINDOW_WIDTH定义为80fDrawSpacedMessage是打印中心文字等的另一个功能。

它构建完美,没有错误,没有警告。但是在运行时,一切正常,但如果fDrawLine执行,程序崩溃并提供错误代码0xc0000005。我知道它有关内存分配的问题,但我已经初始化了compLine字符串。

我尝试了几件事;我认为另一个函数导致了它,所以我隔离fDrawLine,但崩溃继续。使用compLine[0] = 0;更改初始化,compLine[WINDOW_WIDTH] = {0};没有帮助。

它适用于运行Ubuntu的其他机器,使用最新的gcc,但在Windows上使用Code :: Blocks(MinGW)时,它会一直崩溃。

此代码有什么问题?

3 个答案:

答案 0 :(得分:1)

分配的内存开始包含垃圾。将其设置为空字符串,例如:

compLine[0] = '\0';

答案 1 :(得分:1)

不要将compLine声明为指针,因为你不需要它,实际上你的函数中有内存泄漏,首先以这种方式声明compLine

char compLine[1 + WINDOW_WIDTH] = {0}; // strings need an extra byte at the end to mark the end.

然后使用memset设置'-'这样的字符

memset(compLine, '-', length);

当然,请检查length <= WINDOW_WIDTH

这是你的功能修复,所以你可以试试

void fDrawLine(int length)
{
    char compLine[1 + WINDOW_WIDTH] = {0}; // initialized so that last byte is '\0'.
    if (length > WINDOW_WIDTH)
        length = WINDOW_WIDTH;
    memset(compLine, '-', length);        
    fDrawSpacedMessage(compLine, -1, TRUE);
}

除了使用strcat这种方式是一个坏主意,你可以这样做

char *compLine = malloc(1 + length); // the last extra '\0' byte.
if (compLine == NULL) // malloc returns NULL on failure to allocate memory
    return; // so we must abort this function in that case.
for(i = 0; i < length; i++)
    compLine[i] = '-';
compLine[length] = '\0';

fDrawSpacedMessage(compLine, -1, TRUE);
free(compLine);

在这种情况下你也可以使用memset,实际上它更好。

答案 2 :(得分:0)

下面的代码存在一些问题

void fDrawLine(int length)
{
    int i;
    char * compLine = (char *) malloc(WINDOW_WIDTH + 2);

    for(i = 0; i < length; i++)
        strcat(compLine, "-");

    fDrawSpacedMessage(compLine, -1, TRUE);
}

首先,length参数至少应为unsigned int,因为负长度没有意义。理想情况下,您应该使用size_ti也是如此。

接下来,您没有保护自己免受length的无效值的影响。隐式契约是0&lt; = length&lt; = WINDOW_WIDTH - 使其明确。

使用动态分配的内存会导致内存泄漏,因为在调用fDrawSpacedMessage()后不会释放它。

最后,strcat在追加单个字符方面过于苛刻。

将所有这些放在一起,这是另一种实现方式。

void fDrawLine(size_t length)
{
    size_t actual_length = length <= WINDOW_WIDTH ? length : WINDOW_WIDTH;
    char compLine[WINDOW_WIDTH+2];

    memset(compLine, '-', actual_length);
    compline[actual_length] = '\0';
    fDrawSpacedMessage(compLine, -1, TRUE);
}

我已将compline留在WINDOW_WIDTH+2因为我猜fDrawSpacedMessage添加换行符。

如果它仍然崩溃,问题出在fDrawSpacedMessage