这是一个我编写的简单代码,因为我需要确认一件事。
#include <stdio.h>
#include <string.h>
void pr(int a);
int main(void)
{
int a;
printf("starting...\n");
h1:
scanf("%d", &a);
if (a == 20)
return 0;
pr(a);
goto h1;
printf("ending...\n");
return 0;
}
void pr(int a)
{
char buf[256];
if (a == 1)
strcpy(buf, "number 1 has been choosed");
else
strcpy(buf, "other number");
printf("BUF: %s\n", buf);
}
我的问题是:
每次调用函数pr
时,数组buf
会自动清除,或者在函数结束前执行memset
会更安全吗?
答案 0 :(得分:2)
每次调用函数pr时,都会自动清除数组buf
不,它将包含未定义的数据,因为它具有自动存储功能。最简单的是:
char buf[256] = {0}; /* Zeroes entire array. */
或者,既然你使用buf
作为字符串,你可以选择更便宜的:
char buf[256];
buf[0] = 0;
旁注:您的代码看起来不需要此初始化,因为strcpy
不依赖于它,并且每个分支上都有strcpy
。
答案 1 :(得分:1)
不,它没有被清除,内容是不确定的。
最简单的做法是,假设你将它用作C字符串(由零字符终止的字符序列),只需将初始字符设置为零:
char buf[256];
*buf = '\0';
buf
变量是自动存储持续时间对象,标准的相关部分是C11, 6.2.4 Storage durations of objects, para 6
:
对于没有可变长度数组类型的对象,其生命周期从entry进入与其关联的块,直到该块的执行以任何方式结束。 (输入一个封闭的块或调用一个函数暂停,但不会结束,执行当前块。)如果以递归方式输入块,则每次都会创建一个新的对象实例。 对象的初始值是不确定的。如果为对象指定了初始化,则每次在执行块时达到声明时都会执行初始化;否则,每次达到声明时,该值都会变得不确定。