gpt4 book ai didi

c - strcat 生成崩溃程序 (0xc0000005)

转载 作者:太空宇宙 更新时间:2023-11-04 08:32:46 25 4
gpt4 key购买 nike

我需要画一行字符,只要我想。所以我为此编写了一个函数:

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) 时,它总是崩溃。

这段代码有什么问题?

最佳答案

不声明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在这种情况下,它实际上更好。

关于c - strcat 生成崩溃程序 (0xc0000005),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27565976/

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