gpt4 book ai didi

c - 检测到堆栈崩溃 - 已中止(核心已转储)

转载 作者:太空宇宙 更新时间:2023-11-04 06:16:22 25 4
gpt4 key购买 nike

我似乎无法找到为什么这是堆栈粉碎,代码是为了读取一些文件,读取每一行并将其他行放在最后。但是我在代码的最后得到了一个堆栈粉碎检测到的错误。

有什么想法吗?

代码是:

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 错误。

最佳答案

让我们仔细看看这两行:

char num[1];
...
sprintf(num,"%d",i);

您将num 声明为单个 字符的数组,而忘记了C 中的(char) 字符串实际上称为< em>null 终止 字节串。这意味着单个字符的字符串需要两个 char 元素的空间,以适应终止符。

由于您没有空间用于终止符,因此 sprintf越界 写入您的数组,从而导致未定义的行为 并且你粉碎的堆栈。

如果您确定该数字永远不会超过一位数(它不会,它将包括两位数 10),那么您需要一个包含 at 的数组至少两个字符元素。

我还建议您使用 snprintf以避免像这样的缓冲区溢出。

关于c - 检测到堆栈崩溃 - 已中止(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45056618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com