2012-08-27 209 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