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

时间:2017-07-12 11:37:31

标签: c

我似乎无法找到为什么这是堆栈粉碎,代码是读取一些文件,读取每一行和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错误。

2 个答案:

答案 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));

现在这可以在没有堆栈粉碎的情况下运行

谢谢!