我不能用 0 填充 C 中的数组。我正在尝试 memset 和 array[]={0};

I cant fill an array in C all with 0. Im trying memset and array[]={0};

我正在使用 memset 来用全零填充一个数组,但我认为 memset 不能正常工作(当我在编译器中调试它时,它不会用全零填充它( IDK 为什么?))。

例如,当我使用 B[n] = { 0 } 时出现错误:

variable-sized object may not be initialized

代码:

#include <stdio.h>

int main()
{
    int m, n;
    scanf("%d%d", &m, &n);
    int A[m][n];
    int B[n];
    int redici = 0, koloni = 0, vkupno = 0;
    //memset(B, 0, n);
    B[n] = { 0 };
    int popolnetaR[m], popolnetaK[n];
    memset(popolnetaR, 0, m - 1);
    memset(popolnetaK, 0, n - 1);
    return 0;
}

首先,不要使用 int A[m][n] 使用可变大小的 table 声明,因为它的行为并不是在所有情况下都指定的 -- 我强烈建议您阅读 this blog post .在 C99 中它是允许的,但由于 C11 它不是标准的一部分,它是一个可选功能。

为了解决您的问题 -- memset 将 Number of bytes to be set to the value. 作为第三个 num 参数。所以你不想使用

memset(B, 0, n);

但是

memset(B, 0, n * sizeof(int));

你得到的错误基本上是说 ={0} 这个“技巧” 仅适用于常量大小的数组。

这里有一些解释:

  • B[n] = { 0 };是语法错误

  • int B[n] = { 0 }; 违反约束,因为 B 是可变长度数组,C 标准规定 VLA 不能有初始化器.

  • memset(B, 0, n);只是将n字节设置为0,并没有覆盖数组B的全部范围。你应该改为写:

    memset(B, 0, sizeof(*B) * n);
    

    或者简单地说:

    memset(B, 0, sizeof B);
    
  • 同样的说法适用于popolnetaRpopolnetaK

这是修改后的版本:

#include <stdio.h>

int main() {
    int m, n;

    if (scanf("%d%d", &m, &n) != 0 || m <= 0 || n <= 0)
        return 1;

    int A[m][n];
    int B[n];
    int popolnetaR[m], popolnetaK[n];
    int redici = 0, koloni = 0, vkupno = 0;
    memset(A, 0, size A);
    memset(B, 0, size B);
    memset(popolnetaR, 0, sizeof popolnetaR);
    memset(popolnetaK, 0, sizeof popolnetaK);
    // ...
    return 0;
}

但是请注意,使用自动存储分配太多 space 可能会导致 堆栈溢出 ,这将发生在 m and/or n.