2012-02-01 50 views
0

在這裏我有一個函數,這是在一個應用程序連續運行的應用程序中多次調用。此變量聲明可以創建內存問題

我在這裏取的1024 這裏一個字符數組的大小我聲明char input[1024];

所以這是

1) char input[1024]; 
2) char input[1024] = NULL; 

這件事情不會創建經過這麼多次,如果任何內存問題最好的方法我們使用了這個功能。 char input[1024];

我認爲可能是在使用輸入後,我們必須使NULL? 或聲明中我們必須聲明這個東西爲char input[1024] = NULL;所以當它將被下一次調用,以便時間第一次輸入使空值比它的任何內存。

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <fcntl.h> 

void do() { 

     char input[1024]; 

    strcat(input,"ussp-push 04:18:0F:B1:48:[email protected]"); 
    strcat(input,"> dev/null&"); 

    if(system(input) != 0) 
    { 
     printf("\nFailed command\n"); 
    } 
    else 
    { 
      printf("\nSuccesss command\n"); 
    } 

} 
+2

我很驚訝這個編譯過。當我學習C時,確實是一個保留字。 – CashCow 2012-02-01 11:03:25

回答

2

您的程序根本不會初始化input。這可能會導致緩衝區溢出,即使沒有發生,您的程序可能會得到不正確的結果。因此,您的代碼調用未定義的行爲

大概你實際上想把input初始化爲一個空字符串。就像這樣:

char input[1024] = ""; 

一旦你做到了這一點您的通話將strcat工作。

如果您不想初始化input那麼你可以使用strcpy,而不是第一strcat

char input[1024]; 
strcpy(input, "ussp-push 04:18:0F:B1:48:[email protected]"); 

要是你需要在代碼之後空字符串賦值給input像這樣做:

input[0] = '\0'; 

您建議的代碼char input[1024] = NULL無效。它不會編譯。

+0

我希望它不會編譯。比試圖將NULL的前1024個字符的數據複製到緩衝區中更好。 – CashCow 2012-02-01 11:02:11

+0

okie謝謝你的迴應,這是更好的字符輸入[1024] =「」或字符輸入[1024]; – user1089679 2012-02-01 11:06:13

+0

@user哪個更好?他們做不同的事情。如果你想初始化輸入到一個空字符串,使用'char input [1024] =「」'。如果你不想初始化它,不要。你不能像他們那樣比較他們,因爲他們做了不同的事情。 – 2012-02-01 11:08:39

0

strcat將字符串附加到另一個字符串,並且這樣做會在目標字符串中搜索終止符char(\ 0)。由於您沒有初始化目標字符串,因此它可能找不到\ 0。

只是對其進行初始化,例如用:

input[0]='\0'; 
+1

...或用'strcpy'替換第一個'strcat'。 – pmg 2012-02-01 10:59:37

+0

是的,即使使用'sprintf',也有很多不同的方法可以做到這一點。 – vulkanino 2012-02-01 11:02:06

0

這不會編譯:

char input[1024] = NULL; 
$ make nullarray 
cc  nullarray.c -o nullarray 
nullarray.c: In function ‘main’: 
nullarray.c:4:2: error: invalid initializer 
make: *** [nullarray] Error 1 
$ 

在聲明char input[size],編譯器會導致函數原型分配堆棧上的多少內存(如果在函數中)或者在.bss.data部分(如果是頂層),並且您不能將NULL分配給該陣列以嘗試停止它。

或許退後一步,描述你是什麼問題真的試圖解決?你應該使用malloc(3)來分配內存嗎?

0

這不會導致內存問題。每次調用do()時,將在堆棧上分配一個1024字節的數組;該存儲器將用於input整個,其中調用do()。當do()返回時,1024個字節將被釋放,並且在下一個調用中將分配(概念上)新的1024個集合。

無論如何char input[1024] = NULL;是無效的代碼。如果您想初始化input,請改爲嘗試類似char input[1024] = "";

+0

如果我把字符輸入[1024];直接不會造成問題? – user1089679 2012-02-01 11:02:16

+0

它不會導致_memory_問題 - 您不會因重複呼叫而耗盡內存。你應該閱讀變量範圍。正如其他人發佈的那樣,你的'strcat's會失敗,因爲'input'沒有被初始化爲一個有效的字符串,但是這很容易被已經發布的任何方法修復。 – Chowlett 2012-02-01 11:20:13

+0

好吧我會改strcat到strcpy – user1089679 2012-02-01 12:49:22

1

如果你還沒有改變它裏面的功能,使它成爲一個static const陣列

void dostuff() {  
    static const char input[] = "ussp-push 04:18:0F:B1:48:[email protected]> dev/null&"; 

    if (system(input) != 0) 
    { 
     printf("\nFailed command\n"); 
    } 
    else 
    { 
     printf("\nSuccesss command\n"); 
    } 
} 
+1

是不是在C中做保留字? – CashCow 2012-02-01 11:04:09

+0

@CashCow:oops,是的,'do'被保留爲關鍵字。這就是你在沒有想到的情況下複製/粘貼的情況。回答編輯,謝謝。 – pmg 2012-02-01 11:11:15