Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检测到堆栈崩溃-中止(堆芯转储)_C - Fatal编程技术网

C 检测到堆栈崩溃-中止(堆芯转储)

C 检测到堆栈崩溃-中止(堆芯转储),c,C,我似乎不明白为什么这是堆栈崩溃,代码是为了读取一些文件,读取每一行,并在最后猫其他行。但我在代码的最后发现了一个堆栈崩溃错误 有什么想法吗 代码是: 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_si

我似乎不明白为什么这是堆栈崩溃,代码是为了读取一些文件,读取每一行,并在最后猫其他行。但我在代码的最后发现了一个堆栈崩溃错误

有什么想法吗

代码是:

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");
}
void main(int-argc,char*argv[])
{
字符行数;
整数计数=0;
大小缓冲区大小=40;
char*buffer=malloc(buffer_size*sizeof(char));
char*buffer2=malloc(缓冲区大小*sizeof(char));
char*buffer3=malloc(缓冲区大小*sizeof(char));
char*buffer4=malloc(缓冲区大小*sizeof(char));
文件*字典,*名称;
Dictionary=fopen(“/home/overdog/Documents/Coding/Dictionary.txt”,“r”);
name=fopen(“/home/overdog/Documents/Coding/rawnames.txt”,“r”);
而(-1!=getline(&buffer,&buffer\u size,Dictionary))
{
计数=计数+1;

对于(int i=1;i让我们仔细看看这两条线:

char num[1];
...
sprintf(num,"%d",i);
您将
num
声明为单个字符的数组,忘记了C中的(
char
)字符串实际上被称为以null结尾的字节字符串。这意味着单个字符的字符串需要两个
char
元素的空间,以适应终止符

由于没有空间放置终止符,因此
sprintf
将写入超出数组边界的内容,从而导致未定义的行为和崩溃的堆栈

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


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

让我们仔细看看这两行:

char num[1];
...
sprintf(num,"%d",i);
您将
num
声明为单个字符的数组,忘记了C中的(
char
)字符串实际上被称为以null结尾的字节字符串。这意味着单个字符的字符串需要两个
char
元素的空间,以适应终止符

由于没有空间放置终止符,因此
sprintf
将写入超出数组边界的内容,从而导致未定义的行为和崩溃的堆栈

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


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

感谢所有的帮助,一些程序员的话确实有帮助,我想,但我仍然有一个问题。我发现问题在于线路

strcat(buffer4,buffer3);
由于两者的缓冲区大小相同,因此创建了一个字符串,该字符串需要80的缓冲区

我修改了那条线

char *buffer4 =malloc(buffer_size * sizeof(char));
阅读

char *buffer4 =malloc(80 * sizeof(char));
现在,它可以在不破坏堆栈的情况下工作


谢谢!

谢谢你的帮助,一些程序员的话确实帮了我的忙,但我仍然有一个问题。我发现问题出在台词上

strcat(buffer4,buffer3);
由于两者的缓冲区大小相同,因此创建了一个字符串,该字符串需要80的缓冲区

我修改了那条线

char *buffer4 =malloc(buffer_size * sizeof(char));
阅读

char *buffer4 =malloc(80 * sizeof(char));
现在,它可以在不破坏堆栈的情况下工作


谢谢!

因为您要将长度可能为40个字符的字符串连接到一个40个字符的缓冲区中,所以您会遇到麻烦。“如果缓冲区不够大,无法容纳行,则getline()会使用realloc调整其大小,并根据需要更新*lineptr和*n。”@PaulOgilvie ok nice。虽然strcat部分仍然是个问题,但真正的问题在于下面的答案。@Jean-Françoisfar完全同意。这里有很多问题。虽然每行读取一个数字可以使用40个字符……因为您将可能40个字符长的字符串连接到一个40个字符长的缓冲区中,所以您正在寻找麻烦。“如果缓冲区不够大,无法容纳该行,则getline()使用realloc调整其大小,并根据需要更新*lineptr和*n。”@PaulOgilvie ok nice。尽管strcat部分仍然存在问题,但真正的问题在于下面的答案。@Jean Françoisfare完全同意。这里有很多问题。尽管每行读取一个数字可以使用40个字符。。。