В цикле while в C, где у меня объявлен символ [..], мне нужно очищать его каждую итерацию? - PullRequest
1 голос
/ 05 апреля 2011

В цикле while в C, где у меня объявлен символ [..], мне нужно очищать его каждую итерацию?Например:

while (clock() < endTime) { 
    char buf[1000];
    memset(buf, 0, sizeof buf); // Is this necessary?
}

Будет ли буфер инициализироваться на каждой итерации цикла автоматически для всех нулей?Мой memset избыточен?

Спасибо

Ответы [ 2 ]

7 голосов
/ 05 апреля 2011

Локальные объекты в языке C никогда не инициализируются автоматически. Вы должны предоставить инициализатор. В противном случае объект будет содержать мусор.

Итак, ваш memset на самом деле не является «избыточным». Тем не менее, правильный способ инициализации буфера для всех нулей -

char buf[1000] = { 0 };

, а не memset. (Хотя в этом случае memset также будет работать, почти всегда предпочтительнее использовать функцию основного языка, чем функцию библиотеки).

И да, если вы объявляете свой буфер внутри тела цикла, вы должны каждый раз заново инициализировать его.

Конечно, реальный вопрос заключается в следующем: вам действительно нужен буфер, инициализированный для всех нулей при каждой итерации? Если так, то вы должны делать это каждый раз.

1 голос
/ 05 апреля 2011

memset не является избыточным.При каждом новом цикле ваша переменная buf будет перераспределяться в стеке.Пробел НЕ проверяется или автоматически обнуляется, вы получаете то, что получаете.Скорее всего, первые несколько байтов будут мусором благодаря вашему вызову на clock (каждый раз, когда вы вызываете это, он будет использовать пространство в стеке).Так что да, вызов memset необходим.Однако в качестве оптимизации вы можете захотеть объявить buf вне цикла, чтобы избежать неявного перераспределения и перераспределения каждый раз.

Конечно, реальный вопрос: вам нужно, чтобы это были все нуликаждый раз, или это просто больная форма ОКР (не волнуйтесь, я тоже так делаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...