用“零”填充数组-memset()不起作用-[关闭]
Posted
技术标签:
【中文标题】用“零”填充数组-memset()不起作用-[关闭]【英文标题】:Filling array with 'zeroes' -memset() does not work- [closed] 【发布时间】:2013-01-06 23:55:37 【问题描述】:这是代码
int x, y, n, i, j, l, m, o;
printf ("podaj szerokosc planszy na jakiej chcesz zagrac\n");
scanf ("%d", &x);
printf ("podaj dlugosc planszy na jakiej chcesz zagrac\n");
scanf ("%d", &y);
int plansza [x][y];
memset(plansza, 0, sizeof plansza);
int plansza2 [x][y];
memset(plansza2, 0, sizeof plansza2);
printf("plansza: \n");
for(j=0;j<x;j++)
for(l=0;l<y;l++)
printf("%d",plansza[x][y]);
printf(" ");
printf("\n");
printf("plansza2: \n");
for(m=0;m<x;m++)
for(o=0;o<y;o++)
printf("%d",plansza2[x][y]);
printf(" ");
printf("\n");
结果如下:
不知道为什么memset()
根本不起作用,我完全不知道为什么。我应该怎么做才能用零填充数组?
【问题讨论】:
j
、l
、m
和 o
是什么?
sizeof 不会像你想象的那样工作,它会返回代表数组的指针的大小,而不是数组的长度。
@Ben: sizeof
产生数组的总大小(不是数组中元素的数量,也不是指针的大小)。
@Ben:这是一个数组。没有发生指针衰减。数组不是指针,即使隐式转换为指针。
我向你保证; memset
工作。
【参考方案1】:
您在打印循环中使用x
和y
作为索引,尽管事实上它们并不是真正控制这些循环的变量。
在第一个打印循环中,您使用j
和l
作为控制变量,在第二个打印循环中使用m
和o
。您需要使用您正在使用的任何控制变量而不是 x
和 y
(它们是维度)来索引数组。
假设您输入了5
和7
作为尺寸。这为您提供了从 arr[0][0]
到 arr[4][6]
的元素。因为您使用 dimensions 来访问打印循环中的元素,所以您总是会得到arr[5][7]
,它实际上在数组的边界之外。这可能只是给您一个远远超出数组末尾的值(以及由于不变的索引而导致的 same 值),尽管从技术上讲,它是未定义的行为,因此它可以做任何事情。
一旦你开始使用正确的索引,我想你会发现memset
工作得很好。
【讨论】:
int plansza [x][y];memset(plansza, 0, sizeof plansza);int plansza2 [x][y];memset(plansza2, 0, sizeof plansza2); printf("plansza: \n"); for(j=0;j<x;j++) for(l=0;l<y;l++) printf("%d",plansza[j][l]); printf(" "); printf("\n"); printf("plansza2: \n"); for(j=0;j<x;j++) for(l=0;l<y;l++) printf("%d",plansza2[j][l]); printf(" "); printf("\n");
现在正确吗?以上是关于用“零”填充数组-memset()不起作用-[关闭]的主要内容,如果未能解决你的问题,请参考以下文章