【问题标题】:array into function C数组到函数 C
【发布时间】:2012-08-27 12:03:03
【问题描述】:

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

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

【问题讨论】:

  • “怀疑”在印度是否像“问题”一样使用?

标签: c arrays function


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 如果数组是 char 数组,我能问你为什么要这样做吗? :)
  • @polslinux 你在问buf[0] = 0 吗?在 C 中,“字符串”的约定是 0 终止的字符数组。因此,只要您正确使用它们,您就不应该关心过去的 0
【解决方案2】:

不,没有清除,内容不确定。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多