对于一门课程,我正在用C语言做一个时间表式的练习。代码功能齐全,但自动测试显示它分配了416个字节,而实际上应该分配376个字节。这是值a=2,B=9,c=11,d=17。我已经在valgrind上运行了代码,并打开了所有可能的额外细节,但它并没有真正帮助。
我试图将标题行生成作为主时间表创建的一部分,但它最终使用的内存比我当前的方法更多。
destroyTimes函数也应该没有问题,因为valgrind没有报告任何泄漏。
这是时代周刊
#include "times.h"
#include <stdlib.h>
#include <stdio.h>
Times* createTimes(uint a, uint b, uint c, uint d) {
int i,j;
int rows=d-c+2;
int cols=b-a+2;
Times* ret = malloc(sizeof(Times));
uint** kert = malloc(sizeof(uint*)*rows);
if (!ret) {
return NULL;
}
ret->a=a;
ret->b=b;
ret->c=c;
ret->d=d;
kert[0] = malloc(sizeof(uint)*(cols+1));
kert[0][0] = 1;
for(j=1;j<cols;j++) {
kert[0][j] = a;
a++;
}
a = ret->a;
for(i=1;i<rows;i++) {
kert[i] = malloc(sizeof(uint)*(cols+1));
for(j=0;j<cols;j++) {
kert[i][j] = c*kert[0][j];
}
c++;
};
ret->times = kert;
return ret;
}
void destroyTimes(Times* kt) {
uint i;
uint rows = kt->d - kt->c + 2;
if (kt == NULL) {
return;
}
for (i = 0; i < rows; i++) {
free(kt->times[i]);
}
free(kt->times);
free(kt);
}
这里是times.h
#ifndef TIMES_H
#define TIMES_H
typedef unsigned int uint;
struct Times {
uint a,b,c,d;
uint** times;
};
typedef struct Times Times;
Times* createTimes(uint,uint,uint,uint);
void destroyTimes(Times*);
#endif
1条答案
按热度按时间wa7juj8i1#
对于一门课程,我正在用C语言做一个时间表式的练习。
好吧,你想学C。酷...
但是要知道,学习C语言只是完成了一半。您还需要学习如何使用调试器。如何启动调试会话。如何设置断点。如何一步到位如何检查变量值。等等...
现在似乎是做这件事的好时机。
同时,C还带有一个非常强大的内置调试器。它被称为
printf
(note 1)。在执行
malloc
时添加小的调试打印输出将帮助您了解发生了什么。例如:
在这样做之后,我可以运行你的程序并得到:
(See* 注2*)
在查看此输出时,很容易发现列中有一些奇怪的地方。9列怎么会需要40个字节?这是每列4.44字节!没道理啊现在来看看
malloc
列:在修复代码之后(即删除
+ 1
两个地方)程序现在将产生:经验:一些调试打印对于发现bug非常有用。但是,学习如何使用真实的的调试器是很重要的。
printf
不是调试器。开个玩笑...printf
不能替代真实的的调试器,但做一些小的调试打印输出实际上可以非常强大地找到小程序中的bug。Times
* 中添加了8个字节的填充多一点
NULL检查必须在**
kt->d
之前**