2013-04-22 85 views
1

我正在將一個多維字符數組傳遞給c中的函數。 main()或其他函數確定輸入數組的大小(尺寸)。我想在我的函數中動態地確定數組的長度和寬度。到目前爲止,我已經能夠爲第一行動態確定寬度。但是,如果我嘗試使用相同的邏輯來確定長度,則會出現訪問衝突錯誤。這是我到目前爲止的代碼:c char **導致分配錯誤

char * myfunc(char* in[]) 
{ 
    int index=0, cols=0; 
    while(in[0][index++] != '\0'); 
    cols = index - 1; 
    : 
    : 
} 

int main() 
{ 
    char *in[3] = {"abcd","efgh","ijkl"}; 
    char *out = myfunc(in); 
    : 
    : 
} 

對我來說幸運的是,**中所有'行'中的'cols'是相等的。我知道更強大的方法是首先確定行數,然後測試每行後面的列數。每當我嘗試爲行執行類似操作時,我都會導致訪問衝突錯誤。

我應該提到,我無法重新定義傳遞數組維數的函數。我還應該提到,這不是作業或工作,我刷過C編碼技能時遇到了這個問題。有沒有一種方法可以確定上述情況下的行數而不會導致訪問衝突錯誤?

+0

對於初學者來說,這應該是'const char * in [3]'。這些是字面常量。所以你的參數聲明也應該如此。 – WhozCraig 2013-04-22 16:16:15

+0

我真的不控制調用這個函數的函數。這是一個挑戰。 – BigLib 2013-04-22 18:15:06

+0

你不需要控制調用者。調用者可以傳遞非常量字符串(如果他們想要的話)。但除非你打算修改它們,或者將它們傳遞給一個函數,否則沒有理由*不*要在這裏將傳入的指針*聲明爲const。來電者會很好。反過來說(調用者用'const'指針調用,而你需要非const),你會遇到問題,但我在這裏看不到這種情況。 – WhozCraig 2013-04-22 18:57:52

回答

0
char * myfunc(char* in[]) 
{ 
    int rows; 
    for(rows = 0; in[rows]; ++rows) 
     ; 
    printf("%d\n", rows); 

    ..... 
    ..... 
} 

int main() 
{ 
    char *in[] = {"abcd",, "efgh","ijkl", NULL}; 
    char *out = myfunc(in); 
} 

只有當所有字符串的長度相同時,才值得檢測列。

+0

我確實接受了你的建議 - 添加了NULL併爲(rows = 0;在[rows]; ++ rows)中執行以獲得正確的結果。然後我確定每行的寬度是否相同 - 一個要求。 但是,我也試過(行= 0;在[行]; ++行),而不使用NULL。有趣的是,對於我的原始輸入 - {「abcd」,「efgh」,「ijkl」}行count = 10。如果我將「mnop」添加到輸入數組中,rows = 11,則添加「qrst」使rows = 13。我改變了「abc」,依此類推,我仍然得到相同的結果。任何想法,爲什麼會發生這種情況? – BigLib 2013-04-22 18:28:08

+0

@BigLib - for循環在找到NULL(0)時停止。它隨機發生在第10元素或第11元素,因此它停在那裏。然而,你進入了未定義行爲的區域,因此應該避免。當且僅當最後一個元素初始化爲NULL時,才應使用for循環。 – user93353 2013-04-22 18:30:53

+0

是的,我只是不斷嘗試新的投入,看看行爲是否持續。我改變了每行中的字符數 - 列數。該關係似乎只與行數成正比。它似乎並不隨意。但我必須同意你的看法。我至多得到了這種行爲的軼事證據。感謝您的幫助。 – BigLib 2013-04-22 18:48:11

2

對於您擁有的數據,無法完成。但是,你可以添加一個前哨這樣的:

char *in[4] = {"abcd", "efgh", "ijkl", NULL}; 

,然後尋找前哨(這是你在做什麼有效數列,通過查找定點'\0'第一個字符串中)。

+0

謝謝,NULL檢測器工作。 – BigLib 2013-04-22 18:15:31