[英]Stack Smashing Detected - Aborted (core Dumped)
我似乎找不到这是为什么堆栈粉碎的原因,该代码旨在读取某些文件,读取每一行并最后显示其他行。 但是我在代码的最后得到了一个堆栈粉碎检测到的错误。
有任何想法吗?
代码是:
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"
。 然后看到堆栈粉碎错误。
让我们仔细看看这两行:
char num[1];
...
sprintf(num,"%d",i);
您将num
声明为单个字符的数组,而忘记了C中的( char
)字符串实际上称为以null结尾的 字节字符串 。 这意味着单个字符的字符串需要两个 char
元素的空间,以适合终止符。
由于终止符没有空间,因此sprintf
将超出数组的范围 ,从而导致未定义的行为和损坏的堆栈。
如果确定该数字永远不会超过一个数字(它不会包含两位数字10
),那么您需要具有至少两个字符元素的数组。
我还建议您使用snprintf
避免这样的缓冲区溢出。
感谢所有的帮助,一些程序员Dude所说的对我的想法有所帮助,但是我仍然遇到问题。 我发现问题出在
strcat(buffer4,buffer3);
由于两者的缓冲区大小相同,因此创建的字符串需要80的缓冲区?
我修改了线
char *buffer4 =malloc(buffer_size * sizeof(char));
读书
char *buffer4 =malloc(80 * sizeof(char));
现在,这种方法无需堆栈粉碎
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.