繁体   English   中英

检测到堆栈粉碎-已中止(核心已转储)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM