0

这是我编写的一个简单代码,因为我需要确认某件事。

#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做a更安全?memset

4

2 回答 2

2

每次调用函数pr,都会自动清空数组buf

不,它将包含未定义的数据,因为它具有自动存储功能。最简单的方法是:

char buf[256] = {0}; /* Zeroes entire array. */

或者,由于您使用buf的是字符串,您可以选择更便宜的:

char buf[256];
buf[0] = 0;

旁注:您的代码看起来不需要此初始化,因为strcpy它不依赖于它,并且您strcpy在每个分支上都有一个。

于 2012-08-27T12:04:30.243 回答
1

不,它没有被清除,内容是不确定的。

鉴于您将其用作 C 字符串(以零字符终止的字符序列),最简单的做法是将初始字符设置为零:

char buf[256];
*buf = '\0';

buf变量是一个自动存储持续时间对象,标准的相关部分是C11, 6.2.4 Storage durations of objects, para 6

对于这样一个没有可变长度数组类型的对象,它的生命周期从进入与其关联的块开始,直到该块的执行以任何方式结束。(进入封闭的块或调用函数会暂停,但不会结束当前块的执行。)如果递归地进入块,则每次都会创建对象的新实例。对象的初始值是不确定的。如果为对象指定了初始化,则在执行块时每次到达声明时都会执行该初始化;否则,每次达到声明时,该值变得不确定。

于 2012-08-27T12:04:46.367 回答