我不能用 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);
同样的说法适用于popolnetaR
和popolnetaK
。
这是修改后的版本:
#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
.
我正在使用 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);
同样的说法适用于
popolnetaR
和popolnetaK
。
这是修改后的版本:
#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
.