我似乎无法找到为什么这是堆栈粉碎,代码是读取一些文件,读取每一行和cat其他行的结尾。但我得到一个堆栈粉碎检测错误在代码的最后。
有什么想法吗?
代码是:
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 smashing错误。
答案 0 :(得分:4)
让我们仔细看看这两行:
char num[1];
...
sprintf(num,"%d",i);
您将num
声明为单个字符的数组,忘记C中的(char
)字符串实际上被称为 null终止 字节字符串。这意味着单个字符的字符串需要两个 char
元素的空间,以适应终结符。
由于您没有足够的空间用于终结符,因此sprintf
会写出数组的越界,从而导致未定义的行为和您的砸碎了。
如果您确定该数字永远不会超过一位数(它不会包含两位数的数字10
),那么您需要一个至少包含两个字符的数组元件。
我还建议您使用snprintf
来避免缓冲区溢出。
答案 1 :(得分:0)
感谢所有的帮助,一些程序员Dude所说的确实对我有所帮助,但我仍有问题。我发现问题就在于行
strcat(buffer4,buffer3);
由于两者的缓冲区大小相同,因此创建了一个需要80?
缓冲区的字符串我修改了一行
char *buffer4 =malloc(buffer_size * sizeof(char));
阅读
char *buffer4 =malloc(80 * sizeof(char));
现在这可以在没有堆栈粉碎的情况下运行
谢谢!