1

我正在编写这个 C 代码,它接收一个文件并从中读取值,该代码还没有做任何事情,但这是我到目前为止所拥有的。程序在调用四个 malloc 的块中崩溃。如果我注释掉 y、f 和 yp,程序运行良好。我不知道是什么原因造成的。因此,任何帮助将不胜感激。

注意:我正在使用 gcc 在 ubuntu 上对此进行测试。我确实尝试将 malloc 强制转换为“(float *)”,但我仍然遇到同样的错误。

int main( int argc, char *argv[])
{
    FILE *rhs, *output;
    int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;

    rhs = fopen(argv[1], "r");
    // ab+ opens file for writting and creates the file if need be
    output = fopen(argv[2], "ab+");
    niter = atoi(argv[3]);

    // check if files open up or not, if not exit.
    if((rhs == NULL) || (output == NULL))
    {
        printf("Error Opening files.\n");
        exit(1);
    }

    // read in N
    fscanf(rhs, "%d", &n);

    // THIS IS THE BLOCK CAUSING THE CRASH
    // CODE WORKS WHEN I COMMENT OUT LINES AND ONLY LEAVE ONE OF THEM IN
    // generate array to hold values from rhs file
    float *numbers = malloc(sizeof(float) * ((n1)*(n1)));
    float *y = malloc(sizeof(float) * ((n1)*(n1)));
    float *f = malloc(sizeof(float) * ((n1)*(n1)));
    float *yp = malloc(sizeof(float) * ((n1)*(n1)));

    // get numbers and store into array
    while(fscanf(rhs, "%f", &numbers[i]) != EOF)
    {
        printf("In while %f\n", numbers[i]);
        i++;
    }

    fclose(rhs);

    return 0;

}

4

4 回答 4

2

一个问题是:

您正在使用来自以下位置n1的未初始化值进行初始化n

int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;
                                        ^
                                        +-- "n" is not initialized here, might have any value.
                                            thus, "n1" is also not initialized to a known value.

因此,您的调用malloc很可能收到太大的值而无法分配。读完“n”后初始化“n1”:

// read in N
fscanf(rhs, "%d", &n);
n1 = n + 1;

在任何情况下,都值得检查返回值,malloc()以查看它是否返回 NULL,以防无法分配内存。

于 2013-03-19T08:27:00.417 回答
1

调用n1时包含垃圾。malloc()因此,您只需尝试分配大量内存

于 2013-03-19T08:33:45.793 回答
0

通过检查数字y、f、yp的值来判断内存是否分配成功,如果它们的值为NULL,则无法分配内存。n1 的值有多大?

于 2013-03-19T08:28:05.633 回答
0

这是因为n1在您调用时未定义malloc()

int niter, n, i = 0, j = 0, k = 0, n1 = n + 1;

上面的行没有初始化n,所以n1 = n + 1给 . 赋了一个未定义的值n1

您可能需要n1 = n + 1;fscanf(rhs, "%d", &n);.

于 2013-03-19T08:29:50.203 回答