寻找一些我一直试图解决的问题的建议。 程序从文本文件中读取,并根据文件中给出的命令进行一些格式化。它似乎适用于我尝试的每个文件,除了2,它们都相当大。 这是有问题的代码:
/* initalize memory for output */
output.data = (char**)calloc(1,sizeof(char*));
/* initialize size of output */
output.size = 0;
/* iterate through the input, line by line */
int i;
for (i = 0; i < num_lines; i++)
{
/* if it is not a newline and if formatting is on */
if (fmt)
{
/* allocate memory for a buffer to hold the line to be formatted */
char *line_buffer = (char*)calloc(strlen(lines[i]) + 1, sizeof(char));
if (line_buffer == NULL)
{
fprintf(stderr, "ERROR: Memory Allocation Failed\n");
exit(1);
}
/* copy the unformatted line into the buffer and tokenize by whitespace */
strcpy(line_buffer, lines[i]);
char* word = strtok(line_buffer, " \n");
/* while there is a word */
while (word)
{
/* if the next word will go over allocated width */
if (current_pos + strlen(word) + 1 > width)
{
/* make ze newline, increase output size */
strcat(output.data[output.size], "\n");
output.size++;
------->>>>> output.data = (char**)realloc(output.data, sizeof(char*) * (output.size + 1));
使用gdb我已经发现错误是在箭头指向它的行上,唯一的问题是我无法弄清楚它为什么会发生。它只发生在正在格式化的文本文件很大(716行)时,它似乎发生在最后一次迭代(num_lines = 716)。任何想法都会非常感激。谢谢!
编辑:对不起的人,应该提到我对此很新!修正了一些错误。答案 0 :(得分:0)
最直接的问题是:
strncat(output.data[output.size], "\n", 2);
正如BLUEPIXY所指出的那样。目前output.data[output.size]
是一个空指针 1 ,所以你不能strncat
到它。
要解决此问题,您可以分配一些空间:
output.data[output.size] = malloc(2);
if ( NULL == output.data[output.size] )
// error handling...
strcpy(output.data[output.size], "\n");
但是,可能还有另一种解决方案可以更好地适应您未显示的其余功能。 (大概你在某处存放空间来存储word
)。
更新帖子并显示其余功能会很有帮助。还要确保发布确切的代码,因为(output.size + )
无法编译。我想这是你在试图把那些大箭头放在你的线上时引入的拼写错误。
1 实际上它都是零位,这是普通系统上的空指针,但并不能保证对所有系统都是如此。