2012-08-27 114 views
0

这是我编写的一个简单代码,因为我需要确认一件事情。将数组转换为函数C

#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

在印度,“疑问”是否被用作“疑问”? – Scooter

回答

2

每次函数PR被调用时,BUF自动是阵列清除

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

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

或者,因为你使用buf为一个字符串,你可以用更便宜的去:

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

边注:一路代码如下您不需要初始化,因为strcpy不依赖于它,并且每个分支上都有一个strcpy

+0

我可以问你,为什么你这样做,如果数组是一个char数组? :) – polslinux

+0

@polslinux你问'buf [0] = 0'? C中的“字符串”是以0结尾的字符数组。所以只要你正确地使用它们,你就不应该在乎'0'之后的东西。 – cnicutar

+0

aaah ok:D再次感谢! – polslinux

1

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

做最简单的事情,因为你使用它作为一个C字符串(由零字符终止字符序列),是简单地将初始字符设置为零:

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

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

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

+0

我不知道这个把戏:)谢谢! – polslinux