【问题标题】:"Access violation writing location" when writing to file写入文件时的“访问冲突写入位置”
【发布时间】:2020-01-16 21:50:10
【问题描述】:

因此,当我尝试写入文件时,访问冲突写入位置出现错误,并且 int 数组中的值不能很好地传输到据我所知,solve 函数。

void read(int n, int* v);
int prime(int);
void solve(int n, int x, int* v, FILE*);
void open_file_write(char*, FILE*);

void main()
{
    int n, i, x, k, *v;
    FILE* fp = NULL;
    char s[30];
    n = 7;
    open_file_write(s, fp);
    v = new int[n];
    read(n, v);
    x = v[n / 2];
    solve(n, x, v, fp);
    delete[](v);
    if (fp)
        fclose(fp);
    else exit(1);
}

void solve(int n, int x, int* v, FILE* fp)
{
    int i, k = 0;
    float ma = 0;
    for (i = 0; i < n; i++)
        if (v[i] < x && prime(v[i]))
        {
            printf_s("%d ", v[i]);
            k++;
            ma += v[i];
            fprintf_s(fp, "%d   ", v[i]);
        }
    printf_s("\n%f  ", ma / k);

}


void read(int n, int* v)
{
    int i;
    for (i = 0; i < n; i++)
        scanf_s("%d", &v[i]);
}


int prime(int x)
{
    int i;
    if ((!(x % 2) && x != 2) || x == 1 || x == 0)
        return 0;
    else if (x == 2)
        return 1;
    for (i = 3; i * i < x; i++)
    {
        if (!(x % i))
            return 0;
    }
    return 1;
}


void open_file_write(char* file_name, FILE* fp)
{
    errno_t err;
    printf_s("Enter the name of your destination file: ");
    scanf_s("%s", file_name, 100);

    if ((err = fopen_s(&fp, file_name, "w") != 0))   //opening destination file
    {
        puts("Error opening destination file");
        _getch();
        exit(1);
    }
}

【问题讨论】:

  • open_file_write 分配给局部变量。 fp in main 仍然是 NULL。
  • 您告诉scanf_s file_name 缓冲区有100 个字符大,但实际上它只有30 个字符大。 scanf_s 用零填充缓冲区,因此您的程序通过缓冲区溢出表现出未定义的行为。
  • @IgorTandetnik 所以我应该使用 *&fp,对吧?
  • @IgorTandetnik 来自 scanf_s 的缓冲区是问题所在。谢谢!

标签: c file pointers


【解决方案1】:

“您告诉 scanf_s 文件名缓冲区有 100 个字符大,但实际上它只有 30 个字符大。scanf_s 用零填充缓冲区,因此您的程序通过缓冲区溢出表现出未定义的行为。” -- @Igor Tandetnik

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 2015-08-15
    • 2012-12-05
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多