[英]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.