简体   繁体   English

memset不起作用(C)

[英]memset does not work (C)

char path[25500]= {};//iniatize
int visited[2500]= {0};//iniatialize
void fun();//protype

int main(){
    fun();
}

void fun(){
    visited[2300]=1;
    path[0]='9';
    printf("\n%d %s",visited[2300],path);
    memset(path,0,25500);//reset
    memset(visited,0,2500);//reset
    printf("\n %d %s",visited[2300],path);//to see if resetted
}

Outputs are: 输出为:

1 9
1

I want to reset just like in the start. 我想像开始一样重设。 But as you can see, memset doesnot reset. 但是如您所见,memset不会重置。 My compiler is codeblocks. 我的编译器是代码块。

memset(visited,0,2500);//reset

访问的是整数数组,因此应为

memset(visited, 0, 2500 * sizeof(int))

memset takes the number of bytes to set, not the number of elements. memset接受要设置的字节数,而不是元素数。 Change this line: 更改此行:

memset(visited,0,2500);

To something like this and it should work: 对于这样的事情,它应该工作:

memset(visited, 0, 2500 * sizeof(int));
//or like this: memset(visited, 0, sizeof(visited));
memset(visited, 0, 2500)

sets 2500 bytes to 0 from where visited points to. 套2500个字节0从那里visited来分。

However visited referrs to much more memory, namely 2500 times the size of its elements' type. 然而visited referrs到更多的内存,它的元素类型的大小,即2500倍。 That is 2550 * sizeof(visitied[0]) . 那是2550 * sizeof(visitied[0])

So do 也是

    memset(visited, 0, 2500 * sizeof(visited[0])

to 0 out all of visited . 将所有visited都设为0

Your code uses the 2300th element. 您的代码使用第2300个元素。 So assuming the size of an element to be 4 it is at offset 9200 to visited , your code only 0 -out 2500 bytes, so the 2300th element stays untouched by the call to memset() . 因此,假设一个元素的大小为4它在偏移9200 visited ,你的代码只有0退房手续2500个字节,因此第二千三元素撑由呼叫无动于衷到memset()


Referring to tthe comment below: Her a complete snippet on a robust way to use memset() in the OP's context: 参考下面的评论:她是在OP上下文中使用memset()的可靠方式的完整摘要:

#define VISITED_MAXIMUM (2500)

int visited[VISITED_MAXIMUM] = {0} /* line 3 */

/* Tons of code here . */

memset(visited, 0, VISITED_MAXIMUM * sizeof(*visited)); /* line X */

This construct above (line X) would survive without adjustements the change to dynamical memory allocation by replacing line 3 to be: 上面的这种构造(第X行)可以通过将第3行替换为:而无需调整对动态内存分配的更改而得以保留:

int * visited = calloc(VISITED_MAXIMUM, sizeof(*visited));
if (NULL == visited)
  exit(1);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM