【发布时间】:2017-07-12 11:37:30
【问题描述】:
我似乎无法找到为什么这是堆栈粉碎,该代码旨在读取某些文件,读取每一行并在最后查找其他行。但我在代码的最后得到一个堆栈粉碎检测到的错误。
有什么想法吗?
代码是:
void main (int argc, char *argv[])
{
char lineCount;
int count = 0;
size_t buffer_size = 40;
char *buffer =malloc(buffer_size * sizeof(char));
char *buffer2 =malloc(buffer_size * sizeof(char));
char *buffer3 =malloc(buffer_size * sizeof(char));
char *buffer4 =malloc(buffer_size * sizeof(char));
FILE *Dictionary, *Names;
Dictionary = fopen ("/home/overdog/Documents/Coding/dictionary.txt","r");
Names = fopen ("/home/overdog/Documents/Coding/rawnames.txt","r");
while(-1 != getline(&buffer,&buffer_size,Dictionary))
{
count = count + 1;
for (int i =1; i <= 10; i++)
{
memcpy(buffer2,buffer,buffer_size);
char num[1];
RemoveEndLine(buffer2);
sprintf(num,"%d",i);
strcat(buffer2,num);
printf("%s\n",buffer2);
while(-1 != getline(&buffer3,&buffer_size,Names))
{
memcpy(buffer4,buffer2,buffer_size);
printf("before break\n");
strcat(buffer4,buffer3);
printf("%s",buffer4);
}
}
}
printf("Lines = %d \n",count);
free(buffer);
free(buffer2);
free(buffer3);
free(buffer4);
fclose(Dictionary);
fclose(Names);
printf("test\n");
}
输出似乎没问题,并且打印出代码末尾的"test"。然后看到 Stack smasting 错误。
【问题讨论】:
-
因为您正在将可能有 40 个字符长的字符串连接到一个 40 个字符长的缓冲区中,所以您正在寻找麻烦。
-
"如果缓冲区不够大,无法容纳行,getline() 会使用 realloc 调整其大小,并根据需要更新 *lineptr 和 *n。"
-
@PaulOgilvie 好的。不过,strcat 部分仍然是一个问题,但真正的问题在于下面的答案。
-
@Jean-FrançoisFabre,完全同意。这里有很多问题。
-
虽然 40 个字符可以读一个数字每行...
标签: c