[英]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
}
输出为:
1 9
1
我想像开始一样重设。 但是如您所见,memset不会重置。 我的编译器是代码块。
memset(visited,0,2500);//reset
访问的是整数数组,因此应为
memset(visited, 0, 2500 * sizeof(int))
memset
接受要设置的字节数,而不是元素数。 更改此行:
memset(visited,0,2500);
对于这样的事情,它应该工作:
memset(visited, 0, 2500 * sizeof(int));
//or like this: memset(visited, 0, sizeof(visited));
memset(visited, 0, 2500)
套2500个字节0
从那里visited
来分。
然而visited
referrs到更多的内存,它的元素类型的大小,即2500倍。 那是2550 * sizeof(visitied[0])
。
也是
memset(visited, 0, 2500 * sizeof(visited[0])
将所有visited
都设为0
。
您的代码使用第2300个元素。 因此,假设一个元素的大小为4
它在偏移9200 visited
,你的代码只有0
退房手续2500个字节,因此第二千三元素撑由呼叫无动于衷到memset()
参考下面的评论:她是在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 */
上面的这种构造(第X行)可以通过将第3行替换为:而无需调整对动态内存分配的更改而得以保留:
int * visited = calloc(VISITED_MAXIMUM, sizeof(*visited));
if (NULL == visited)
exit(1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.