C 我的错误在哪里?

C 我的错误在哪里?,c,linux,gdb,C,Linux,Gdb,我有足够好的编译代码,但当我试着运行它时,我得到了一个分段错误,我无法找出是什么错误 该程序的目的是将不同尺寸和数量的片段ascii艺术文件的文本拼凑在一起。 这些碎片被命名为部分_xx-yy,其中xx是从00到11,yy是从00到05 #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void) { int width; int height; int

我有足够好的编译代码,但当我试着运行它时,我得到了一个分段错误,我无法找出是什么错误

该程序的目的是将不同尺寸和数量的片段ascii艺术文件的文本拼凑在一起。 这些碎片被命名为部分_xx-yy,其中xx是从00到11,yy是从00到05

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main(void)
{
    int width;
    int height;
    int xPieces;
    int yPieces;
    int xTens=0;
    int xOnes=0;
    int yTens=0;
    int yOnes=0;
    printf("Fragment width: ");
    scanf("%d", &width);
    printf("Fragment height: ");
    scanf("%d", &height);
    printf("Number of fragments on x axis: ");
    scanf("%d", &xPieces);
    printf("Number of fragments on y axis: ");
    scanf("%d", &yPieces);
    printf("wtf0");
    char *line=malloc(sizeof(width) * sizeof(char));
    printf("wtf1");
    char array[xPieces][yPieces][height][width];
    printf("wtf2");
    char fileName[50];
    printf("wtf3");
    for(int x = 0; x<xPieces;)
    {
        printf("%d", x);
        for(int y = 0; y<yPieces;)
        {
            printf("%d", y);
            if(xOnes>=10) 
            {
                xOnes=0;
                xTens++;
            }
            if(yOnes>=10)
            {
                yOnes=0;
                yTens++;
            }
            snprintf(fileName, sizeof fileName, "part_%i%i-%i%i", xTens, xOnes, yTens, yOnes);
            FILE *file=fopen(fileName, "r");
            char buffer[(width) * (height)];
            fread(buffer, 1, (width) * (height), file);
            for(int i = 0; i<height; i++)
            {
                printf("%d", i);
                for(int j = 0; j<width; j++)
                {
                    printf("%d", j);
                    array[x][y][i][j] = buffer[j + (i * (width))];
                }
            }
            fclose(file);
            y++;
            yOnes++;
        }
        x++;
        xOnes++;
    }

    FILE *newFile=fopen("newFile", "w");

    for(int y = 0; y<yPieces; y++)
    {
        for(int i = 0; i<height; i++)
        {
            for(int x = 0; x<xPieces; x++)
            {
                for(int j = 0; j<width; j++)
                {
                    fwrite(&array[x][y][i][j], 1, 1, newFile);
                }
            }
        }
    }

    fclose(newFile);
    free(line);
}
我想也许fread()试图读取一个太小的缓冲区,所以我将缓冲区增加到10000(这应该是戏剧性的过度),但是,唉,没有用。 我现在已经做了很多研究,为这个问题挣扎了几个小时,但仍然不知道如何进一步,因为我发现类似的问题对我来说没有多大意义或者不够相似

我想在这一点上,我需要其他人看看我的代码,所以任何帮助都将不胜感激

更新:我对代码进行了一些更改,但现在我发现了一个分段错误:

Program received signal SIGSEGV, Segmentation fault.
0x08049058 in main () at innlev3.c:50
50                      *array[x][y][i][j] = buffer[j + (i * (*width))];
我觉得这部分很好。。。我做错了什么,在这里

更新2:再次更新代码。我发现了一些我觉得很奇怪的东西。。。这两个printf都不是为了我scanf的工作。。。A我又回到了好的老fread()分段错误。我想这是一件好事我没有提出一个新的问题P

Program received signal SIGSEGV, Segmentation fault.
0x0018d68c in fread () from /lib/tls/i686/cmov/libc.so.6
(gdb) backtrace
#0  0x0018d68c in fread () from /lib/tls/i686/cmov/libc.so.6
#1  0x08048fc6 in main ()

在使用之前,您不会将*宽度设置为任何值

您希望在阅读尺寸后进行分配

printf("fragment width: ");
scanf("%i", width);
printf("fragment height: ");
scanf("%i", height);
char *line=malloc(sizeof(*width) * sizeof(char));
而且,这并不是你想象的那样:

        FILE *file=fopen(*fileName, "r");
它将打开一个名为“p”的文件

这也不是你想象的那样:

        fileName[5] = "%i",xTens;

我认为您正在考虑python。

在使用之前,您没有将*width设置为任何值

您希望在阅读尺寸后进行分配

printf("fragment width: ");
scanf("%i", width);
printf("fragment height: ");
scanf("%i", height);
char *line=malloc(sizeof(*width) * sizeof(char));
而且,这并不是你想象的那样:

        FILE *file=fopen(*fileName, "r");
它将打开一个名为“p”的文件

这也不是你想象的那样:

        fileName[5] = "%i",xTens;

我认为您正在考虑python。

如果您运行
gdb
并进行回溯,您会看到:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a8a724 in fread () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) backtrace
#0  0x00007ffff7a8a724 in fread () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x0000000000400ad1 in main ()

这意味着您正在
fread
中崩溃。
fread()
中的文件变量似乎不正确

如果运行
gdb
并进行回溯,您会看到:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a8a724 in fread () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) backtrace
#0  0x00007ffff7a8a724 in fread () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x0000000000400ad1 in main ()

这意味着您正在
fread
中崩溃。
fread()
中的文件变量似乎不正确

我猜
文件
空的
,可能表明
*文件名
不存在

请注意这样的陈述:

fileName[5] = "%i",xTens;
不要做你可能期望的事情。该声明相当于:

fileName[5] = xTens;
这应该给您一个编译器警告,因为您正在将
int
赋值给
char*

相反,您可能打算使用
snprintf
来使用
printf
样式的格式来构造文件名

char filename[50];
snprintf(filename, sizeof filename, "part_%i%i-%i%", xTens, xOnes, yTens, yOnes);
FILE *file=fopen(fileName, "r");

对于第二次崩溃:在
数组
上有一层额外的指针。将其声明为
char数组…
,并在访问时删除
*
。现在,您已经告诉编译器元素将是指针,但是您没有让它们指向任何地方,然后您让编译器使用
*
查看它们指向的位置。轰

最后使用
数组
时,需要将指针指向每个要传递到
fwrite
的字符。您可以使用名为“address of”的
&
操作符来实现这一点,它的用法类似于
&array…

操作员的地址与
*
相反。程序运行后,可以使用
&
其他地方简化代码。例如,不必声明
int*width
并使用
malloc
将其从堆中分配,您可以将
*
到处移除,并将
&width
传递给
scanf


既然我们回到了
fread
segfault:在使用它之前,请检查
fopen
的返回值。如果为
NULL
,则打印错误消息

if(file == NULL)
{
    printf("can't open %s\n", fileName);
    exit(1);
}

这可能会告诉你出了什么问题。但是,这不是调试代码。您通常应该检查调用的函数是否返回错误。

我猜
文件
空的
,可能表明
*文件名
不存在

请注意这样的陈述:

fileName[5] = "%i",xTens;
不要做你可能期望的事情。该声明相当于:

fileName[5] = xTens;
这应该给您一个编译器警告,因为您正在将
int
赋值给
char*

相反,您可能打算使用
snprintf
来使用
printf
样式的格式来构造文件名

char filename[50];
snprintf(filename, sizeof filename, "part_%i%i-%i%", xTens, xOnes, yTens, yOnes);
FILE *file=fopen(fileName, "r");

对于第二次崩溃:在
数组
上有一层额外的指针。将其声明为
char数组…
,并在访问时删除
*
。现在,您已经告诉编译器元素将是指针,但是您没有让它们指向任何地方,然后您让编译器使用
*
查看它们指向的位置。轰

最后使用
数组
时,需要将指针指向每个要传递到
fwrite
的字符。您可以使用名为“address of”的
&
操作符来实现这一点,它的用法类似于
&array…

操作员的地址与
*
相反。程序运行后,可以使用
&
其他地方简化代码。例如,不必声明
int*width
并使用
malloc
将其从堆中分配,您可以将
*
到处移除,并将
&width
传递给
scanf


既然我们回到了
fread
segfault:在使用它之前,请检查
fopen
的返回值。如果为
NULL
,则打印错误消息