用“零”填充数组-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() 根本不起作用,我完全不知道为什么。我应该怎么做才能用零填充数组?

【问题讨论】:

jlmo 是什么? sizeof 不会像你想象的那样工作,它会返回代表数组的指针的大小,而不是数组的长度。 @Ben: sizeof 产生数组的总大小(不是数组中元素的数量,也不是指针的大小)。 @Ben:这是一个数组。没有发生指针衰减。数组不是指针,即使隐式转换为指针。 我向你保证; memset 工作。 【参考方案1】:

您在打印循环中使用xy 作为索引,尽管事实上它们并不是真正控制这些循环的变量。

在第一个打印循环中,您使用jl 作为控制变量,在第二个打印循环中使用mo。您需要使用您正在使用的任何控制变量而不是 xy(它们是维度)来索引数组。

假设您输入了57 作为尺寸。这为您提供了从 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&lt;x;j++) for(l=0;l&lt;y;l++) printf("%d",plansza[j][l]); printf(" "); printf("\n"); printf("plansza2: \n"); for(j=0;j&lt;x;j++) for(l=0;l&lt;y;l++) printf("%d",plansza2[j][l]); printf(" "); printf("\n"); 现在正确吗?

以上是关于用“零”填充数组-memset()不起作用-[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,memset函数都可以给啥类型的数组清零?

memset函数详解

用数组填充 UITableView 不起作用

c语言里有memset()怎么用?需要啥头文件?

用数组的内容填充表格视图不起作用

用零填充缺失的用户输入