数组到函数C

时间:2012-08-27 12:03:03

标签: c arrays function

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

#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会更安全吗?

2 个答案:

答案 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进入与其关联的块,直到该块的执行以任何方式结束。 (输入一个封闭的块或调用一个函数暂停,但不会结束,执行当前块。)如果以递归方式输入块,则每次都会创建一个新的对象实例。 对象的初始值是不确定的。如果为对象指定了初始化,则每次在执行块时达到声明时都会执行初始化;否则,每次达到声明时,该值都会变得不确定。