C - Malloc导致程序崩溃

时间:2013-03-19 08:24:44

标签: c crash malloc

我正在编写这个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 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分: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);