我需要画出一行符号。所以我为此目的编写了一个函数:
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
定义为80
,fDrawSpacedMessage
是打印中心文字等的另一个功能。
它构建完美,没有错误,没有警告。但是在运行时,一切正常,但如果fDrawLine
执行,程序崩溃并提供错误代码0xc0000005
。我知道它有关内存分配的问题,但我已经初始化了compLine
字符串。
我尝试了几件事;我认为另一个函数导致了它,所以我隔离fDrawLine
,但崩溃继续。使用compLine[0] = 0;
更改初始化,compLine[WINDOW_WIDTH] = {0};
没有帮助。
它适用于运行Ubuntu的其他机器,使用最新的gcc,但在Windows上使用Code :: Blocks(MinGW)时,它会一直崩溃。
此代码有什么问题?
答案 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_t
。 i
也是如此。
接下来,您没有保护自己免受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